awk如何将unix命令的结果作为参数?

时间:2012-06-01 22:35:36

标签: bash shell awk

假设有一个带有制表符分隔字段的输入文件,第一个字段是整数

1 abc
1 def
1 ghi
1 lalala
1 heyhey
2 ahb
2 bbh
3 chch
3 chchch
3 oiohho
3 nonon
3 halal
3 whatever

首先,我需要计算第一个字段中唯一值的计数,即:

5 for 1, 2 for 2, and 6 for 3

然后我需要找到这些计数的最大值,在这种情况下,它是6。

现在我需要通过" 6"以另一个awk脚本作为参数。

我知道我可以使用下面的命令来获取计数列表:

cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort 

但是如何获取第一个计数并将其作为参数传递给下一个awk命令而不是作为输入文件?

3 个答案:

答案 0 :(得分:5)

对于awk来说,这没什么特别的。

程序可以从stdin读取,然后你可以用管道传递输入:

prg1 | prg2 

或者您的程序希望输入为参数,然后使用

prg2 $(prg1) 

请注意,在两种情况下,prg1都在prg2之前处理。

有些程序允许两种可能性,而大量数据很少作为参数传递。

答案 1 :(得分:3)

这个AWK脚本取代了你的整个管道:

awk -v parameter="$(awk '{a[$1]++} END {for (i in a) {if (a[i] > max) {max = a[i]}}; print max}' inputfile)" '{print parameter}' otherfile

其中'{print parameter}'是您的其他AWK脚本的替代品,“otherfile”是该脚本的输入。

注意: 极其 可能会将两个AWK脚本组合成一个不如黑客攻击的脚本以您问题中列出的方式(awk喂养awk)。

答案 2 :(得分:2)

您可以使用shell的$()命令替换:

awk -f script -v num=$(cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort | tail -1) < input_file

(我添加了tail -1以确保最多使用一行。)