「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に置き換えることです。
あなたは次のようなことで行うことができます:
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]++
の各[〜#〜] r [〜#〜] ecord、[〜#〜] s [〜# 〜] Spaceまたは\n
ewlineで区切ると、レコード全体がキーとしてseen
と呼ばれる関連配列に格納され、同じキーが再び表示されるとその値が増加します。
すべてのレコードが読み取られるEND{ ... }
で、このブロックが実行され、キーごとに(x
を、forループを使用してその配列内のすべての要素をトラバースする変数インデックスとして定義します) )配列に保存され、count
という新しい配列のキーとしてseenseen[x]
の値を使用し、同じキーに対してその値をインクリメントしました。
その後、別のループと変数インデックスとしてy
を使用して、最初に値count[y]
(カウント)とy
キーを出力しました。