3

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

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 命令?

4

3 回答 3

5

这对于 awk 来说并没有什么特别之处。

任何一个程序都可以从标准输入中读取,然后您可以使用管道传递输入:

prg1 | prg2 

或者您的程序需要输入作为参数,然后您使用

prg2 $(prg1) 

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

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

于 2012-06-01T22:48:05.070 回答
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

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

注意:这两个 AWK 脚本有可能合并为一个,这比以您的问题 ( awkfeeding awk) 中概述的方式执行它的方式更少。

于 2012-06-02T04:03:37.963 回答
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以确保最多使用一行。)

于 2012-06-01T22:42:10.993 回答