텍스트 파일에서 중복 줄을 제거하고 삭제된 줄 수를 얻는 방법은 무엇입니까?

텍스트 파일에서 중복 줄을 제거하고 삭제된 줄 수를 얻는 방법은 무엇입니까?

나도 알아

awk '!seen[$0]++' filename > output.txt

모든 중복 항목은 텍스트 파일에서 제거할 수 있습니다. 하지만 이 정보를 사용하여 다른 파일에서 동일한 줄을 삭제할 수 있도록 삭제된 줄 목록을 어떻게 얻을 수 있습니까?

한 언어로 작성된 큰 텍스트 파일에서 모든 중복 항목을 제거한 다음 번역된 일치 항목을 잃지 않고 해당 언어로 번역된 파일에서 동일한 줄을 제거하고 싶기 때문에 이것이 필요합니다.

더 명확하게 설명하려면: (문서 1)

line A
line B
line A
line C
...

(문서 2):

line 1
line 2
line 3
line 4
...

파일 1에서 "라인 A"를 삭제하고 파일 2에서 "라인 3"을 삭제합니다. 번역 필요:

line A -> line 1
line B -> line 2
line C -> line 4
... 

파일 1B(중복 제거됨)는 다음과 같습니다.

line A
line B
line C
...

파일 2B(중복 제거됨)는 다음과 같습니다.

line 1
line 2
line 4
... 

답변1

$ awk 'FNR==NR && !seen[$0]++ { keep[FNR]=$0; next } (FNR in keep) { printf("%s -> %s\n", keep[FNR], $0) }' file1 file2
line A -> line 1
line B -> line 2
line C -> line 4

이 프로그램은 문제 중간부터 출력을 재현합니다 awk.

프로그램은 첫 번째 파일( file1)을 읽고 첫 번째 블록에서 중복된 줄을 찾습니다. 이 블록은 또한 keep행 번호로 색인화되어 배열에 유지될 행을 보유합니다 .

두 번째 파일(코드의 두 번째 블록)을 읽을 때 줄 번호가 유지하려는 번호인 경우 두 번째 파일의 줄과 함께 첫 번째 파일에서 저장된 줄을 출력합니다.

두 가지 새로운 파일 변형을 저장합니다.

awk 'FNR==NR && !seen[$0]++ { keep[FNR]=$0; print >FILENAME ".new"; next } (FNR in keep) { print >FILENAME ".new" }' file1 file2

file1.new쓰기에는 의 고유 행만 사용 하고 file1쓰기 file2.new에는 동일한 행을 사용하지만 에서는 file2.

이 솔루션의 유일한 단점은 2개의 x메모리가 필요하다는 것입니다. 여기서 x첫 번째 파일의 고유 라인 수는 입니다. 즉, 각 고유 라인의 복사본 2개를 저장합니다 file1(배열의 인덱스 seenkeep배열의 ​​값). .

답변2

이는 2단계 프로세스입니다.

  1. 원하지 않는 줄을 제거하기 위해 sed 스크립트를 생성하는 awk 스크립트

    awk 'seen[$0]++ {print NR "d"}' file1 > remove.sed 
    
  2. 그런 다음 sed 스크립트를 사용하여 원하는 파일의 행을 삭제하십시오.

    sed -i -f remove.sed file1 file2
    

관련 정보