Use resultados awk como parâmetros para outro comando

2

Estou extraindo linhas de um conjunto de arquivos de texto com o awk. Os arquivos são assim:

1000    1    75
1000    2    76
1001    1    76
1001    2    80

Estou pesquisando vários diretórios destes com este comando:

awk -F"\t" '$3 == "76" { print $1"\t"$2}' ../benchmark/*/labels.txt

o awk está me dando a saída correta:

1000    2
1001    1

Agora, para cada linha encontrada, devo executar um script passando esses dois números como parâmetros, assim:

./build.oct 1000    2

Qual é a maneira correta de fazer isso? Eu realmente não me importo com a saída do console de script (produz arquivos).

    
por Kuroki Kaze 18.06.2014 / 10:01

3 respostas

4

Você também pode usar xargs ( -l faz com que ele execute um comando separado para cada linha):

timp@helez:~/tmp$ awk -F"\t" '$3 == "76" { print $1"\t"$2}' test.txt | xargs -l ./build.oct 
$1 is  1000  and $2 is  2
$1 is  1001  and $2 is  1

timp@helez:~/tmp$ cat test.txt
1000    1   75
1000    2   76
1001    1   76
1001    2   80
timp@helez:~/tmp$ cat build.oct
echo '$1 is ' $1 ' and $2 is ' $2

Como sugerido nos comentários, você também pode simplificar o comando awk , já que awk e xargs são divididos em tabulações e espaços:

timp@helez:~/tmp$ awk '$3 == "76" {print $1,$2}' test.txt | xargs -l ./build.oct
$1 is  1000  and $2 is  2
$1 is  1001  and $2 is  1
    
por 18.06.2014 / 10:15
2

Isso funcionou para mim:

awk -F"\t" '$3 == "76" { printf "./build.oct %d %d\n", $1, $2}' \
../benchmark/*/labels.txt | bash
    
por 18.06.2014 / 10:09
0

Supondo que as colunas 1 e 2 não terão espaço em branco nas entradas, você também pode fazer:

awk -F"\t" '$3 == "76" { print $1"\t"$2}' ../benchmark/*/labels.txt |
    while read a b; do ./build.oct $a $b; done
    
por 19.06.2014 / 01:21