ファイルに各行が現れる回数を数える


23

私が含むファイルがあるとします:

A
A
A
B
CC

次のような出力が必要です。

A 3
B 1
CC 1

回答:


23

私はそれを考え出した; uniqのオプションの1つは-c、「出現回数によるプレフィックス行」の場合です。

$ uniq -c

1
最初に数字を置くことに注意してください。ご注文についてうるさいだったら、あなたは何ができる:uniq -c filename.txt | sed 's/[^0-9]*\\([0-9]\+\\) \\(.*\\)/\2 \1/'
frabjous

12
また、隣接する繰り返し行のみがカウントされることに注意してください。一般的なイディオムはsort | uniq
スティーブンD

4
また、uniqは、データの前にカウントを配置します。元の質問には、実際には次のようなものが必要です。uniq -c | awk '{print $ 2、$ 1}'
ブルース・エディガー

場合には、それは上記のコメントから明らかではない、あなたがしなければならないデータは、あなたの目標を達成するために最初にソートされていることを確認します。ソートされていない場合は、繰り返しエントリがあります。たとえば、元のファイルがであった場合A \ A \ A \ B \ A \ CC、の出力uniq -cはshow A 3と後で表示されA 1ます。最初にソートすると、すべての同
一行

16

同様の問題でここに来ました。これから、私はやや高度なコマンドをまとめることができました。

Steven Dが上記のコメントで述べたように、uniq隣接する繰り返し行のみをカウントするため、最初に行をソートする必要があります。その後、一意の行を見つけて、再度ソートして、最も出現する行が上になるようにします。

sort file.txt | uniq -c | sort -nr > output.txt

出力はファイルにリダイレクトされますoutput.txt。結果をコマンドラインで表示するだけの場合は、リダイレクトを削除し、最後のコマンドをに変更しsort -nて、最も一般的な行が画面の一番下に表示されるようにします。


4
cat file.txt | sortだけで置き換えることができsort file.txtます。:)
mattdm

1
@mattdm:この定式化の欠点は、すぐにcatもっと面白いものに置き換えることができないことです。あなたが知っているので、ありませんcat
SamB

1
@SamB次に、として記述します< file.txt sort | uniq -c。これは簡単に編集でき、不要なを回避しcatます。
hvd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.