次のようなファイルがあるとします。
123
123
234
234
123
345
「123」が重複した回数、「234」が重複した回数などを調べたいので、理想的には次のような出力になります。
123 3
234 2
345 1
次のようなファイルがあるとします。
123
123
234
234
123
345
「123」が重複した回数、「234」が重複した回数などを調べたいので、理想的には次のような出力になります。
123 3
234 2
345 1
回答:
1行に1つの数値があると仮定します。
sort <file> | uniq -c
--count
LinuxバージョンなどのGNUバージョンでは、より詳細なフラグも使用できます。
sort <file> | uniq --count
sort
のように再び:sort <file> | uniq -c | sort -n
これは、重複した行のみをカウントし、印刷します:
sort FILE | uniq -cd
または、GNUロングオプションを使用します(Linuxの場合):
sort FILE | uniq --count --repeated
上のBSDとOSXあなたはgrepを使用する必要が独自のラインアウトフィルタ:
sort FILE | uniq -c | grep -v '^ *1 '
この例では、結果は次のようになります。
3 123
2 234
一度だけ現れるものを含むすべての行のカウントを印刷したい場合:
sort FILE | uniq -c
または、GNUロングオプションを使用します(Linuxの場合):
sort FILE | uniq --count
指定された入力の出力は次のとおりです。
3 123
2 234
1 345
最も頻度の高い行を先頭にして出力を並べ替えるには、次のようにします(すべての結果を取得するため)。
sort FILE | uniq -c | sort -nr
または、重複する行のみを取得するには、最も頻繁に最初に:
sort FILE | uniq -cd | sort -nr
OSXとBSDでは、最後は次のようになります。
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
または| sort -nr
を追加すると、繰り返しカウント(それぞれ昇順または降順)で出力がソートされます。これはあなたが求めていることではありませんが、役立つかもしれないと思いました。
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
経由 awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
awk 'dups[$1]++'
コマンド、変数は$1
COLUMN1の全内容を保持し、角括弧は、配列アクセスです。したがって、data
ファイルの行の最初の列ごとに、指定された配列のノードdups
がインクリメントされます。
そして最後に、変数dups
をnum
として配列をループし、保存された数値を最初に出力してから、によって複製された値の数を出力しdups[num]
ます。
入力ファイルの一部の行の終わりにスペースがあることに注意してください。それらをクリアすると、上記のコマンドの$0
代わりに使用できます$1
:)
uniq
ませんか?
sort | uniq
また、awkソリューションでは、パフォーマンスとリソースのトレードオフが大きく異なります。ファイルが大きく、異なる行数が少ない場合、awkソリューションの方がはるかに効率的です。それは行数で線形であり、スペース使用量は異なる行数で線形です。OTOH、awkソリューションはすべての異なる行をメモリに保持する必要がありますが、(GNU)ソートは一時ファイルに頼ることができます。
「Windows PowerShell」を使用するWindowsでは、以下のコマンドを使用してこれを実現しました
Get-Content .\file.txt | Group-Object | Select Name, Count
また、where-objectコマンドレットを使用して結果をフィルタリングすることもできます
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count