web-dev-qa-db-ja.com

uniq-cから生成された最初の列をどのようにカウントしますか

「Seespot」「Seepotrun」などのランダムな単語が5行ずつ新しい行にリストされているファイルがあります。各Wordがファイルに表示され、適切に並べ替えられた回数をカウントするコードを作成することができました。

4 Spot  
3 run  
2 see  
1 sees  
1 Run  
1 Jane  

私が使用したコード:

cat "FILENAME" | tr ' ' '\n' | sort -n | uniq -c | sort -r  

各単語を新しい行に配置し、並べ替えてから、一意の値をカウントして、もう一度並べ替えました。今、私はそのカウントを取る必要がありますが、この出力で:

3 1  
1 2  
1 3  
1 4  

これは、1、1ワード2、1ワード3、1ワード4のカウントを持つ3つのワードがあることを意味します。

私は2つの問題を抱えています。 1は、uniq-cからすでにカウントされている最初の列のカウントを取得する方法です。 2番目の問題は、2番目の列の単語を削除し、元のカウント1、2、3、4に置き換えることです。

1
Mack

あなたは次のようなことで行うことができます:

tr ' ' '\n' <infile \
 | sort -n \
 | uniq -c \
 | awk '{ seen[$1]++ } END{for (x in seen) print seen[x], x }'

あるいは:

tr ' ' '\n' <infile | sort -n | uniq -c|cut -d' ' -f7 |sort |uniq -c

または、awkだけで行うこともできます。

awk '{ seen[$0]++ } 
    END{ for (x in seen) count[seen[x]]++; for (y in count) print count[y],y }
' RS='( |\n)+' infile
3 1
1 2
1 3
1 4

上記のawkseen[$0]++の各[〜#〜] r [〜#〜] ecord、[〜#〜] s [〜# 〜] Spaceまたは\newlineで区切ると、レコード全体がキーとしてseenと呼ばれる関連配列に格納され、同じキーが再び表示されるとその値が増加します。

すべてのレコードが読み取られるEND{ ... }で、このブロックが実行され、キーごとに(xを、forループを使用してその配列内のすべての要素をトラバースする変数インデックスとして定義します) )配列に保存され、countという新しい配列のキーとしてseenseen[x]の値を使用し、同じキーに対してその値をインクリメントしました。

その後、別のループと変数インデックスとしてyを使用して、最初に値count[y](カウント)とyキーを出力しました。

2
αғsнιη