假设有一个带有制表符分隔字段的输入文件,第一个字段是整数
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命令而不是作为输入文件?
答案 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
以确保最多使用一行。)