使用 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

現在,對於每個找到的行,我必須執行一個腳本,將這兩個數字作為參數傳遞,如下所示:

./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,因為 和 都awkxargs製表符和空格上拆分:

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
  • parallel 您可以透過(或xargs -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) }' ....

相關內容