나도 알아
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
(배열의 인덱스 seen
및 keep
배열의 값). .
답변2
이는 2단계 프로세스입니다.
원하지 않는 줄을 제거하기 위해 sed 스크립트를 생성하는 awk 스크립트
awk 'seen[$0]++ {print NR "d"}' file1 > remove.sed
그런 다음 sed 스크립트를 사용하여 원하는 파일의 행을 삭제하십시오.
sed -i -f remove.sed file1 file2