파일의 모든 줄이 고유한지 확인


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
모든 줄이 고유한지 확인 하시겠습니까, 아니면 중복을 제거 하시겠습니까?
비트 트리

1
@ 8bittree-독창성을 원합니다
snr

답변:


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

정확히 내가 무엇을 제외하고 말한 것 uniq대신에sort -u
Nonny 무스

1
입력이 아직 정렬되지 않은 경우 uniq큰 실수가됩니다. 인접한 줄만 중복 제거합니다!
Alexis

1
범인에 관심이 있다면 sort <file> | uniq -d, 사본을 인쇄 할 것입니다.
Rolf

25

Awk 솔루션 :

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

4
+1 허용 된 답변은 전체 파일을 두 번 읽지 만 한 번의 읽기에서 중복 된 줄이 생기면 중지됩니다. 파이프 입력에서도 작동하지만 다른 파일은 다시 읽을 수있는 파일이 필요합니다.
JoL

당신은 밀어 수 없습니다 echo로를 END?
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams 에코에는 아무런 의미가 없습니다. 수행 && echo또는 || echo답변에 규칙을 것은 명령이 종료 상태 코드로 옳은 일을한다는 것을 나타냅니다. 중요한 것은입니다 exit(1). 이상적으로, 당신은 이것을 바보 처럼 사용 if has_only_unique_lines file; then ...하지 않을 if [[ $(has_only_unique_lines file) = "no dupes" ]]; then ...것입니다.
JoL

2
다른 응답이 메모리를 절약하기 위해 파일을 두 번 읽는 경우 중복이 없으면 전체 파일을 메모리로 읽습니다.
Kusalananda

1
@Kusalananda 이것은 듀프가 없을 때 전체 파일을 메모리로 읽는 동안 듀피 sort가 있는지 여부에 관계없이 will을 사용하는 것입니다. 메모리 절약은 어떻습니까?
JoL

21

사용 sort/ uniq:

sort input.txt | uniq

중복 행만 확인하려면 -duniq 옵션을 사용하십시오 . 중복 된 행만 표시되며, 없으면 표시되지 않습니다.

sort input.txt | uniq -d

이것은 나의 goto입니다. 투표율이 높은 다른 답변이 무엇을 제공하는지 잘 모르겠습니다.
user1717828

1
중복을 제거하는 것이 좋습니다.
snr

1
이것은 그가 원하는 것을하지 않습니다. 그는 알고 싶어 하는 경우 제거하지, 중복있다.
Barmar

@Barmar : 그런 식으로 보이지만 질문은 여전히 ​​불분명합니다. 뿐만 아니라 OP를 설명하려고 시도합니다.
jesse_b

더 명확한 설명이 추가 된 보류중인 수정 사항이 있습니다.
Barmar

5

TLDR

원래 질문은 명확하지 않았으며 OP가 단순히 파일 내용의 고유 버전을 원한다는 것을 읽었습니다. 아래에 나와 있습니다. 업데이트 된 질문 형식에서 OP는 이제 파일의 내용이 고유한지 여부를 단순히 알고 싶다고 말합니다.


파일 내용이 고유한지 테스트

sort파일이 고유하거나 중복이 포함되어 있는지 확인 하는 데 간단히 사용할 수 있습니다 .

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

이 두 파일이 있다고 가정 해보십시오.

중복 샘플 파일
$ 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하고 목록의 맨 아래에 복제본이 다시 표시됩니다.

제공 한 예제에 하나의 복제본을 추가했습니다.

$ 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한동안 매뉴얼 페이지를 읽지 않았으므로 대안을 빠르게 살펴 보았습니다. 다음은 중복 항목을보고 싶다면 두 번째 정렬이 필요하지 않습니다.

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

실제로 좋은 대안입니다. #rez
snr

2

중복이 없으면 모든 행이 고유합니다.

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

설명 : 파일 줄을 정렬하여 반복되는 줄을 연속으로 만듭니다 (정렬)
동일한 모든 연속 줄을 추출합니다 (uniq -d).
위의 명령 출력이 있으면 ( [...]), ( &&) 메시지를 인쇄하십시오.


2

이것은 Perl 답변 없이는 완료되지 않을 것입니다!

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

고유하지 않은 각 행을 한 번 인쇄합니다. 아무 것도 인쇄하지 않으면 파일에 고유 한 행이 모두 있습니다.


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

허용 된 답변과 마찬가지로 파일을 두 번 정렬합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.