Awk 计算和打印文件中的事件

Awk 计算和打印文件中的事件,awk,sed,counting,Awk,Sed,Counting,我有一个文件如下所示: cond1 20 cond1 10 cond1 5 cond2 12 cond3 10 cond3 9 cond3 1 cond4 2 cond5 10 cond5 8 cond1 20 1 cond1 10 2 cond1 5 3 cond2 12 1 cond3 10 1 cond3 9 2 cond3 1 3 cond4 2 1 cond5 10 1 cond5 8 2 我尝试按第一列、第二列对文件进行排序,然后添加第三列,其中包含前两列中字符串排名的

我有一个文件如下所示:

cond1 20
cond1 10
cond1 5
cond2 12
cond3 10
cond3 9
cond3 1
cond4 2
cond5 10
cond5 8
cond1 20 1
cond1 10 2
cond1 5  3
cond2 12 1
cond3 10 1
cond3 9  2
cond3 1  3
cond4 2  1
cond5 10 1
cond5 8  2
我尝试按第一列、第二列对文件进行排序,然后添加第三列,其中包含前两列中字符串排名的计数。它看起来是这样的:

cond1 20
cond1 10
cond1 5
cond2 12
cond3 10
cond3 9
cond3 1
cond4 2
cond5 10
cond5 8
cond1 20 1
cond1 10 2
cond1 5  3
cond2 12 1
cond3 10 1
cond3 9  2
cond3 1  3
cond4 2  1
cond5 10 1
cond5 8  2
我知道有一些awk或sed命令可以做到这一点,但我似乎无法理解
uniq-c
不符合我的要求。如有任何建议,将不胜感激

$ awk '{print $0, ++rank[$1]}' file
cond1 20 1
cond1 10 2
cond1 5 3
cond2 12 1
cond3 10 1
cond3 9 2
cond3 1 3
cond4 2 1
cond5 10 1
cond5 8 2
如果原始输入文件尚未排序,则在调用
sort
之前进行预处理:

$ sort -k1,1 -k2,2nr file | awk '{print $0, ++rank[$1]}'
cond1 20 1
cond1 10 2
cond1 5 3
cond2 12 1
cond3 10 1
cond3 9 2
cond3 1 3
cond4 2 1
cond5 10 1
cond5 8 2
如果您想直观地排列间距,请向
追加一个调用:

$ awk '{print $0, ++rank[$1]}' file | column -t
cond1  20  1
cond1  10  2
cond1  5   3
cond2  12  1
cond3  10  1
cond3  9   2
cond3  1   3
cond4  2   1
cond5  10  1
cond5  8   2

根据口味混合搭配……

使用
排序
awk
,排序后只要在awk在第1列中找到新词时重置变量n(不使用数组)

输入

$ cat f
cond1 20
cond1 10
cond1 5
cond2 12
cond3 10
cond3 9
cond3 1
cond4 2
cond5 10
cond5 8
$ sort -k1,1 -k2,2nr f | awk '$1!=p{n=0; p=$1}{print $0,++n}' 
cond1 20 1
cond1 10 2
cond1 5 3
cond2 12 1
cond3 10 1
cond3 9 2
cond3 1 3
cond4 2 1
cond5 10 1
cond5 8 2
输出

$ cat f
cond1 20
cond1 10
cond1 5
cond2 12
cond3 10
cond3 9
cond3 1
cond4 2
cond5 10
cond5 8
$ sort -k1,1 -k2,2nr f | awk '$1!=p{n=0; p=$1}{print $0,++n}' 
cond1 20 1
cond1 10 2
cond1 5 3
cond2 12 1
cond3 10 1
cond3 9 2
cond3 1 3
cond4 2 1
cond5 10 1
cond5 8 2

当您可以将
printf
与格式说明符一起使用时,是否真的使用了第三方工具(如
column-t
)来实现相同的功能?:)@如果要使用
printf
,您首先需要计算出前两个字段的最大宽度,这意味着当
column
可用时,将采用两次通过的方法,并且代码比值得费心处理的代码还要多。干杯!只是想听听你的意见