passando os resultados do comando awk como parâmetro

0

Suponha que usei awk para obter o valor de duas colunas diferentes:

Diga que a saída é:

abc

def

Agora, desejo usar os padrões abc e def como grep , usando um pipeline com o comando anterior. Existe alguma maneira de fazer isso?

Para mais esclarecimentos:

Eu tenho um arquivo pdf e estou procurando uma palavra-chave no arquivo usando:

pdftotext 'filename.pdf' - | grep 'pattern'

Agora, se qualquer correspondência for encontrada, eu quero usar a primeira e a segunda coluna do resultado como parâmetros para o grep no pipeline com o comando anterior. Eu posso pegar as duas primeiras colunas usando

pdftotext 'filename.pdf' - | grep 'pattern' | awk '{ print $1, "\t"$2 }'

Agora, como vou passar esses dois valores novamente (segunda vez) como padrões após o comando grep no pipeline com o acima?

    
por Black 13.09.2015 / 16:02

4 respostas

4

Você poderia fazer isso com a substituição do processo da seguinte forma:

grep -f <(awk '{print $1 "\n" $3}' filename) otherfile

Isso terá grep lido seus padrões de um arquivo (o -f flag), que nesse caso é realmente a saída do processo awk...filename que imprime os padrões um por linha. Em seguida, o grep procura esses padrões em otherfile

Embora talvez menos eficiente se você realmente quiser fazer isso em um pipeline, você poderia fazer isso com grep lendo seus padrões de stdin como

awk '{print $1 "\n" $3}' filename | grep -f - otherfile

Editar: vendo a edição da sua pergunta sobre como usar o grep e depois o awk, você pode deixar o awk fazer a correspondência de padrões para você:

grep -Ff <(awk '/pattern/ {print $1 "\n" $3}' <(pdftotext 'filename.pdf' -)) otherfile

ou como um pipeline:

pdftotext 'filename.pdf' - | awk '/pattern/ {print $1 "\n" $3}' | grep -Ff - otherfile
    
por 13.09.2015 / 16:48
2

Muitos shells suportam substituição de comandos para que, por exemplo,

p=$(awk '{ print $1,$3 }' filename)

captura a saída do comando awk '{ print $1,$3 }' filename na variável p . Observe que seu cat é redundante aqui: awk pode ler diretamente de filename .

No entanto, suspeito que o que você realmente quer fazer é processar sucessivas linhas de saída awk e analisá-las em variáveis separadas . Se for esse o caso, provavelmente você pode fazer algo como

awk '{print $1,$3}' filename | while read -r p1 p2; do grep -F "$p1" otherfile | grep -F "$p2"; done

para encontrar linhas em otherfile que correspondam aos dois campos $1 e $3 de filename .

    
por 13.09.2015 / 16:45
0

Isso pode ser feito usando a substituição de comandos.

Citações de aqui :

Command substitution allows the output of a command to be substituted in place of the command name itself. Command substitution shall occur when the command is enclosed as follows:

$(command)

or (backquoted version):

'command'

    
por 13.09.2015 / 16:39
0

Você pode aprender como usar xargs para passar e definir parâmetros.

cat filename|awk '{print $1,"\n"$3}'|xargs -I {} grep {} somefile

xargs -I {} substitui o parametro por "{}" para deixar o grep usá-lo

    
por 13.09.2015 / 17:59