Utilice los resultados de awk como parámetros para otro comando

Utilice los resultados de awk como parámetros para otro comando

Estoy extrayendo filas de un conjunto de archivos de texto con awk. Los archivos se ven así:

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

Estoy buscando en varios directorios de estos con este comando:

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

awk me está dando el resultado correcto:

1000    2
1001    1

Ahora para cada fila encontrada debo ejecutar un script pasando estos dos números como parámetros, así:

./build.oct 1000    2

¿Cuál es la forma correcta de hacer eso? Realmente no me importa la salida de la consola de script (produce archivos).

Respuesta1

También puedes usar xargs( -llo hace ejecutar un comando separado para cada línea):

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 se sugiere en los comentarios, también puedes simplificar el awkcomando, ya que ambos awkse xargsdividen en tabulaciones y espacios:

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

Respuesta2

Esto funcionó para mí:

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

Respuesta3

Considera esto:

cat ../benchmark/*/labels.txt |
while IFS=$'\t' read P1 P2 P3 ; do
  [[ $P3 == 76 ]] && echo $P1 $P2
done |
sort -u |
parallel ./build.oct
  • guarda awkel subproceso con readlineel analizador incorporado (vea los comentarios a continuación)
  • evitas los engaños consort -u
  • aprovechas el uso de recursos con parallel (o xargs -l1)

Otro enfoque de interés, pilotado por awk:

awk -F'\t' '$3==76 && !seen[$1,$2]++ {
  print $1 FS $2 | "parallel ./build.oct"
}' ../benchmark/*/labels.txt
  • reutilizar el separador de campo de entrada FSen lugar de literal
  • los incautos se descartan usando una serie de contadores
  • aprendes a conectar el subproceso awk

Respuesta4

Gnu awk tiene una systemfunción. Podrías ejecutar algo como

awk '$3 == "76" { system("./build.oct " $1 " " $2) }' ....

información relacionada