2017-01-13 28 views
1

我有一個看起來像這樣的文件:計數及印刷出現在文件

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不會做我正在尋找的東西。任何意見,將不勝感激。

回答

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 

混搭風味....

+2

它是後當你可以使用'printf'和for時,真的@Ed使用'column -t'等第三方工具mat說明符實現相同? :) – Inian

+2

@Inian要穩健地使用'printf',你首先需要弄清楚前兩個字段的最大寬度,這意味着一個2遍方法和更多的代碼,而不是'column'可用時值得打擾的代碼。 –

+2

乾杯!只是想要你的看法 – Inian

0

使用sortawk,排序只是重置變量n每當AWK在列1發現新詞(不使用陣列)

$ 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