uniq -cで生成された最初の列を計算する方法

uniq -cで生成された最初の列を計算する方法

私はそれぞれ、新しい行に「See Spot」「See pot run」などのランダムな単語の5行をリストするファイルを持っています。各単語がファイルに表示される回数を数え、正しく並べ替えるコードを作成できました。

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の単語が3つ、2つの単語が1つ、3つの単語が1つ、4つの単語が1つあります。

2つの質問があります。 1 は、uniq -c で既に数である最初の列の数を取得する方法です。 2番目の問題は、2番目の列の単語を削除し、元の数である1,2,3,4に置き換えることです。

答え1

次のことができます。

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]++項目について記録、S\nレコード全体は空白またはewlinesで区切られたキーと呼ばれる連想配列に格納され、seen同じキーが再表示されるとその値が増加します。

END{ ... }このブロックはすべてのレコードを読み取るときに実行され、各キー(xこの配列のすべての要素を反復するために変数インデックスとして定義)に対して実行されます。~のためループ)が配列に格納されているので、値を使用しました。ボン seen[x]新しい配列のキーとして呼び出され、count同じキーの値が再び増加します。

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

関連情報