私はそれぞれ、新しい行に「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
上記のawk
各seen[$0]++
項目について右記録、S\n
レコード全体は空白またはewlinesで区切られたキーと呼ばれる連想配列に格納され、seen
同じキーが再表示されるとその値が増加します。
END{ ... }
このブロックはすべてのレコードを読み取るときに実行され、各キー(x
この配列のすべての要素を反復するために変数インデックスとして定義)に対して実行されます。~のためループ)が配列に格納されているので、値を使用しました。ボン seen[x]
新しい配列のキーとして呼び出され、count
同じキーの値が再び増加します。
後で、別のループとy
変数のインデックスを使用して最初にその値count[y]
(カウント)とy
キーを印刷します。