テキストファイルから重複した値のみを印刷する方法は?


70

次のような数値の列があるとします。

File1:

1 
2
3
3
3
4
4
4
5
6

出力が欲しい:

3  
4

つまり、繰り返される行のみです。Linuxでこれを見つけるためのコマンドラインツールはありますか?(注意:値は数値順にソートされています)。


3
をご覧くださいman uniq
jasonwryan

関連する、より難しい質問:重複行をペアで削除する
ワイルドカード

回答:


119

uniq(1)これに使用できます:

uniq -d file.txt

これにより、重複のみが出力されます。入力ファイルは、すべての重複が連続するようにソートする必要があります(重複しているように見えます)。そうでない場合は、最初にソートを実行します。


1
トリプリケートのみを印刷したい場合はどうすればよいですか?
MiNdFrEaK

8
トリプリケートsort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'用の@MiNdFrEaK 。N-plicatesのための任意のNとの"3"を置き換える
full.stack.ex

@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'三重のための

@camhはcsvファイルでもこれを行うことができますか?特定の列の値のみ?
-NumenorForLife

1
file.txtを並べ替える| uniq -d
ロン

1

uniqand を使用awk

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'

6
これは動作しますが、なぜ出力をパイプするのかわかりませんcat
ベルンハルト

1
誰もがあなたができることuniq -c File1を知っているわけではなく、他の多くのツールでも同様です。それはおそらくここで起こっていることです。
マティアス

1

これを実行します: perl -ne 'print if $a{$_}++' filename.txt


3\n3\n4\n\4n明らかに間違っている入力File1を提供します。
八重ashi

再訪したperl snipは、各行の発生回数を提供するため、必要に応じてパイプ、ソート、およびフィルタリングできます。perl -ne '$ a {$ _} ++; END {while(($ k、$ v)= each%a){printf "%d \ t%s"、$ v、$ k}} 'ファイル名
-Theophrastus

特定のフィールドセパレータで区切られた特定の列でそれを行う方法はありますか?
ジェレミア

yaegashiで示されているように、要件を満たすには小さな修正が必要です:perl -ne 'print if 1 == $ a {$ _} ++' filename.txtすべての答えの中で、他の答えは私のお気に入りですすべてのデータを完全に並べ替えて前処理する必要があります。この回答により、出力結果がより迅速かつ効率的に開始されます。
BOC

0

uniq リストを並べ替える必要があります。デフォルトはアルファベット順です。

sort | uniq -d path/to/your/filename

または

cat fileName | sort | uniq -d path/to/your/filename

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.