ファイルのすべての行が一意であることを確認します


11

次のような行を含むテキストファイルがあります。

This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
.
.
.
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520

すべての行の一意性をどのように確認できますか?

注:目的はファイルをテストすることであり、重複する行が存在する場合にファイルを変更することではありません。



1
すべての行が一意であるかどうかを確認しますか、それとも重複を削除しますか?
8ビットツリー2018

1
@ 8bittree-一意性を確認したい
snr

回答:


24
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique

uniq代わりにsort -u
ノニームース

1
入力がまだソートされていない場合はuniq、大きな間違いです。隣接する行を重複排除するだけです!
アレクシス2018

1
犯人に関心がある場合はsort <file> | uniq -d、複製を印刷します。
ロルフ

25

Awkソリューション:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"

4
+1受け入れられた回答はファイル全体を2回読み取りますが、1回の読み取りで重複する行が見つかるとすぐに停止します。これはパイプ入力でも機能しますが、他のファイルは再読み取り可能なファイルが必要です。
JoL、2018

あなたは押し込むことができませんでしたechoにはEND
イグナシオバスケスエイブラムス

2
@ IgnacioVazquez-Abramsエコーには意味がありません。こう&& echo|| echoのコマンドが終了ステータスコードで正しいことをしていることを示すための答えでは慣例です。重要なのはexit(1)です。理想的には、これをのようif has_only_unique_lines file; then ...に使うのではなくif [[ $(has_only_unique_lines file) = "no dupes" ]]; then ...、ばかげているでしょう。
JoL 2018

2
他の回答がメモリを節約するためにファイルを2回読み取る場合、重複がなければ、ファイル全体がメモリに読み込まれます。
クサラナンダ

1
@Kusalanandaこれは、重複がない場合にファイル全体をメモリに読み込みますが、重複sortがあるかどうかに関係なく、willも使用します。それはどのようにメモリを節約していますか?
-JoL

21

sort/ を使用uniq

sort input.txt | uniq

重複行のみをチェックするには-d、uniq のオプションを使用します。これは、重複している行のみを表示し、ない場合は何も表示しません。

sort input.txt | uniq -d

これは私の後藤です。投票数の多い他の回答が、この回答が提供していないことは何なのかわかりません。
user1717828

1
重複を削除するのに適した方法です。
snr

1
これは彼が望むことをしません。彼は、重複を削除するのではなく、重複があるかどうかを知りたいと考えています。
バーマー

@Barmar:そのように見えますが、問題はまだ不明です。同様に、OPはそれを明確にしようとコメントします。
jesse_b

さらに説明を追加する保留中の編集があります。
バーマー

5

TLDR

元の質問は不明確であり、OPは単にファイルのコンテンツの一意のバージョンを必要としていたことを読みました。以下に示します。OPは、更新された質問の形式で、ファイルの内容が一意であるかどうかを単に知りたいだけであると述べています。


ファイルの内容が一意であるかどうかをテストします

を使用sortして、ファイルが一意であるか、重複が含まれているかどうかを確認できます。

$ sort -uC input.txt && echo "unique" || echo "duplicates"

次の2つのファイルがあるとします。

サンプルファイルの複製
$ cat dup_input.txt
This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
一意のサンプルファイル
$  cat uniq_input.txt
A
B
C
D

これらのファイルを分析すると、それらが一意であるか、重複が含まれているかがわかります。

重複ファイルのテスト
$ sort -uC dup_input.txt && echo "unique" || echo "duplicates"
duplicates
一意のファイルをテストする
$ sort -uC uniq_input.txt && echo "unique" || echo "duplicates"
unique

元の質問(ファイルの一意の内容)

だけで行うことができますsort

$ sort -u input.txt
This is a thread  139737186379520
This is a thread  139737194772224
This is a thread  139737203164928
This is a thread  139737312270080
This is a thread  139737505302272
This is a thread  139737513694976
This is a thread  139737522087680

3

私は通常sortファイルを使用してuniqから、重複の数をカウントするために使用しsort、リストの下部に重複をもう一度表示します。

提供した例に1つの複製を追加しました。

$ sort thread.file | uniq -c | sort
      1 This is a thread  139737186379520
      1 This is a thread  139737194772224
      1 This is a thread  139737203164928
      1 This is a thread  139737312270080
      1 This is a thread  139737513694976
      1 This is a thread  139737522087680
      2 This is a thread  139737505302272

私はuniqしばらくの間マニュアルページを読んでいませんでしたので、私は他の選択肢を簡単に調べました。重複を表示するだけの場合は、次の方法で2番目の並べ替えの必要がなくなります。

$ sort thread.file | uniq -d
This is a thread  139737505302272

それは確かに良い選択肢です。#rez
snr

2

重複がない場合、すべての行は一意です。

[ "$(sort file | uniq -d)" ] && echo "some line(s) is(are) repeated"

説明:ファイルの行を並べ替えて、繰り返される行を連続させます(sort)
等しいすべての連続した行を抽出します(uniq -d)。
上記のコマンドの出力がある場合([...])、次に(&&)メッセージを出力します。


2

これは、Perlの回答がなければ完了しません!

$ perl -ne 'print if ++$a{$_} == 2' yourfile

これにより、一意でない各行が1回だけ印刷されます。何も印刷されない場合、ファイルにはすべて一意の行が含まれます。


1

とを使用cmpsortbash

cmp -s <( sort file ) <( sort -u file ) && echo 'All lines are unique'

または

if cmp -s <( sort file ) <( sort -u file )
then
    echo 'All lines are unique'
else
    echo 'At least one line is duplicated'
fi

これは、受け入れられた答えのように、ファイルを2回ソートします。

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