我正在使用 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
,因为 和 都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
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) }' ....