ファイルの最初の列の出現回数を数える


9

次のファイルがあります。

1 2 
1 3
1 2
3 3
52 1
52 300

そして1000以上。

最初の列に各値が出現する回数を数えたい。

1  3 
3  1
52 2

つまり、13回見ました。

Perl、AWK、またはBashでそれを行うにはどうすればよいですか?


3
こんにちはアラシャム!最近、あなたが非常によく似た質問をしていて、すべて同じトピックを中心に扱っているのを見ました。コミュニティがあなたを助けたいと確信していますが、多分、あなたがすでに試したことと、どこに行き詰まっているかを私たちに示すことができますか?質問する前に少し努力を払う必要があります。他の人に特定のもののコードを提供するように依頼するだけでは、何も学びません。この背景を正確に教えてくれませんか?多分あなたが望むものを達成するより簡単な方法があるでしょう、そして私たちはいくつかの抽象的な数字を持つダミーの例に頼る必要はありませんか?
slhck

あなたの助けのためのtnx。私はbgpdumpデータを操作してそれらを解析しています。
アラッシュ、

回答:


12

入力がソートされている場合は、uniqを使用できます。

<infile cut -d' ' -f1 | uniq -c

そうでない場合は、最初に並べ替えます。

<infile cut -d' ' -f1 | sort -n | uniq -c

出力:

  3 1                                      
  1 3
  2 52

出力は要件と比較して入れ替えられますawk '{ print $2, $1 }'。これを使用して変更できます。

1 3 
3 1
52 2

ソートされた入力を必要としないawkイディオムもあります。

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

出力:

1 3
52 2
3 1

ここでの出力はハッシュからのものなので、順序付けされません。sort -n必要な場合は渡してください。

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

GNU awkを使用している場合は、awk内から並べ替えを行うことができます。

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

最後の2つの場合の出力は次のとおりです。

1 3
3 1
52 2

tnx .itsは機能しました:)
Arash

あなたはコードを説明できますか??? awk '{h [$ 1] ++} END {for(k in h)print k、h [k]}' | sort -n
Arash

3
@arashams:{h[$1]++}ブロックは行ごとに評価されます。hはハッシュで$1あり、最初の列であり、へのキーとして使用されますh。したがって、これはどれだけ頻繁にユニークな$1が見られるかを集計します。ENDブロックは、入力の終了時に実行され、キーと集計を出力しています。sort -n出力を数値でソートします。
2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.