我有一个看起来像这样的文件:
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
没有做我想要的。任何建议将不胜感激。
答案 0 :(得分:2)
$ 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
如果您希望在视觉上排列间距,则附加呼叫column
:
$ 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
混合搭配品尝......
答案 1 :(得分:0)
使用sort
和awk
,只要awk在column1中找到新单词(不使用数组),只需重置变量n
$ sort -k1,1 -k2,2nr file | awk '$1!=p{n=0; p=$1}{print $0,++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