2017-01-13 12 views
1

私はこのようなファイルがあります:私は最初の列、2番目の列でファイルをソートするためにしようとしているカウントと印刷発生が

cond1 20 
cond1 10 
cond1 5 
cond2 12 
cond3 10 
cond3 9 
cond3 1 
cond4 2 
cond5 10 
cond5 8 

を、次いで3番目の列を追加します最初の2つの列の文字列の順位の数。

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と一緒に使うことができるとき、' column -t'のようなサードパーティのツールを使って実際に@Edしますマット指定子は同じを達成するために? :) 'printf'を使用する – Inian

+2

が@Inian確実に、あなたは最初の2パスアプローチと、それは' COLUMN'が利用可能になったときに悩ま価値があるよりも多くのコードを意味最初の2つのフィールドの最大幅を把握する必要があると思います。 –

+2

乾杯!ただあなたの意見が欲しかった – Inian

0

awkは(配列を使用せずに)column1の中で新しい単語を発見したときにだけ、変数nをリセットし、ソートした後とawk

$ 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 
関連する問題