awk結果を他のコマンドの引数として使用する

awk結果を他のコマンドの引数として使用する

私はawkを使用してテキストファイルセットから行を抽出しています。ファイルは次のようになります。

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

次のコマンドを使用して、これらのディレクトリのいくつかを検索しています。

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

awkは私に正しい出力を与えます。

1000    2
1001    1

これで、見つかった各行に対して、次のようにこれら2つの数値をパラメータとして渡すスクリプトを実行する必要があります。

./build.oct 1000    2

これを行う正しい方法は何ですか?私はスクリプトコンソール出力(ファイル生成)にあまり興味がありません。

答え1

xargs(を使用-lして各行に対して別々のコマンドを実行させることもできます):

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

コメントで提案されているように、およびおよびタブとスペースawkに分割さawkれているため、コマンドを単純化することもできます。xargs

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

答え2

これは私にとって効果的です。

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

答え3

考えてみてください:

cat ../benchmark/*/labels.txt |
while IFS=$'\t' read P1 P2 P3 ; do
  [[ $P3 == 76 ]] && echo $P1 $P2
done |
sort -u |
parallel ./build.oct
  • 組み込みパーサーをawk使用して子プロセスを保存します(以下の説明を参照)。readline
  • 詐欺に遭うことを避けることができますsort -u
  • parallelxargs -l1(または)を介してリソースを利用できます。

その他の興味のある方法は次のとおりですawk

awk -F'\t' '$3==76 && !seen[$1,$2]++ {
  print $1 FS $2 | "parallel ./build.oct"
}' ../benchmark/*/labels.txt
  • FSテキストの代わりに入力フィールド区切り記号を再利用する
  • カウンター配列を使用して重複した項目を削除する
  • パイプを介してawkサブプロセスに接続する方法を学びます。

答え4

Gnu awkにはsystem機能があります。次のように何かを実行できます

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

関連情報