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
( -l
lo 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 awk
comando, ya que ambos awk
se xargs
dividen 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
awk
el subproceso conreadline
el analizador incorporado (vea los comentarios a continuación) - evitas los engaños con
sort -u
- aprovechas el uso de recursos con
parallel
(oxargs -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
FS
en lugar de literal - los incautos se descartan usando una serie de contadores
- aprendes a conectar el subproceso awk
Respuesta4
Gnu awk tiene una system
función. Podrías ejecutar algo como
awk '$3 == "76" { system("./build.oct " $1 " " $2) }' ....