파일에서 두 줄이 같은지 확인하는 유닉스 명령?


24

파일에서 두 줄이 같은지 확인할 수있는 유닉스 명령이 있습니까?

예를 들어 파일을 고려하십시오 sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

우리는 그 문장이

This is sentence X

반복됩니다.

이것을 빨리 감지 할 수있는 명령이 있습니까? 그래서 아마도 다음과 같이 실행할 수 있습니다-

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

답변:


40

원하는 정확한 출력을 얻는 방법은 다음과 같습니다.

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

설명:

내부 $(sort sentences.txt | uniq -d)에는 두 번 이상 나타나는 각 줄이 나열됩니다. 바깥 쪽 grep -nFx은 이 줄들 과 sentences.txt정확히 -x일치하는 줄을 다시 찾고 -F줄 번호 앞에 붙습니다.-n


귀하의 수정 사항은 똑같은 대답을 게시하는 것에서 거의 이길 수 없었습니다. +1
케이시

따라서 $ (command) 구문은 일종의 대체물로 작동합니까?
CodeBlue

2
@CodeBlue-예. 그것은 명령
대치

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txt좀 더 효율적이고 잠재적 인 arg list too long문제를 피할 수 있습니다.
Stéphane Chazelas

10

정확히 원하는 것은 아니지만 결합 sort하고 시도해 볼 수 있습니다 uniq -c -d.

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2다음은 해당 라인에서 찾은 중복 수입니다 man uniq.

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

파일 내용이 메모리에 적합 awk하면 이것에 적합합니다. comp.lang.awk의 표준 one-liner (이 컴퓨터에서 인스턴스를 검색 할 수는 없지만 매월 몇 개가 있습니다)는 중복이 awk 'n[$0]++'있는지 감지하기 위해 각 줄 값의 발생 횟수를 계산하고 발생을 인쇄합니다. 기본 조치는 print $0입니다.

첫 번째를 포함하여 모든 발생을 형식으로 표시하지만 둘 이상의 값이 복제 될 때 혼합 순서로 표시하려면 조금 더 까다 롭습니다.

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

명확성을 위해 여러 줄로 표시되면 일반적으로 실제로 사용됩니다. 이 작업을 자주 수행하면 awk을 사용하여 파일에 스크립트를 넣거나 awk -f셸 스크립트에 전체를 넣을 수 있습니다 . 가장 간단한 awk것처럼 이것은와 매우 유사하게 수행 할 수 있습니다 perl -n[a].

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