두 개의 텍스트 파일이 있고 이를 하나로 병합하고 싶다고 가정해 보겠습니다.
두 번째 파일은 첫 번째 파일의 줄로 시작하므로 해당 줄의 일부가 반복됩니다. 중복된 내용이 있습니다.
이 파일들을 어떻게 병합할 수 있나요?
물론 일반 바이너리와 여러 부분에 대한 솔루션은 이상적으로 환영받습니다.
답변1
짧고 좋은 해결책처럼 보이는 것은 어디에나 존재하지만 불길한 awk 중복 제거기입니다.
awk '!x[$0]++'
중복된 항목을 제거할 뿐만 아니라 입력 파일의 원래 순서도 유지합니다. 다음은 명령이 작동하는 방식에 대한 설명입니다.awk '!a[$0]++'는 어떻게 작동하나요?
이렇게 사용하세요
awk '!x[$0]++' file1 file2
먼저 file1을 인쇄한 다음 겹치지 않고 file2를 인쇄합니다. 중복된 부분은 중복되므로 제거됩니다.
하지만 조심하세요! 삭제될 거예요모두파일에 중복이 있습니다. 관찰하다:
$ cat file1
a
b
b
overlap1
overlap2
$ cat file2
overlap1
overlap2
p
q
q
$ awk '!x[$0]++' file1 file2
a
b
overlap1
overlap2
p
q
또한 겹치지 않는 중복 행을 제거합니다.
파일이 복제되지 않았거나 어쨌든 삭제하려는 경우 이 명령을 사용하면 됩니다.
중복된 행을 유지하려면 계속 읽으세요.
중복을 삭제하지 않고 중복을 수동으로 제거하는 방법은 다음과 같습니다. 자동화할 수도 있지만 노력을 기울이지 않았습니다.
먼저 첫 번째 파일에서 마지막 줄을 가져옵니다.
$ tail -n1 file1
overlap2
이제 두 번째 파일에서 이 줄 앞의 모든 줄을 삭제합니다.
$ sed '0,/overlap2/d' file2
p
q
q
file1을 두 번째 명령의 결과와 연결하면 중복 없이 연결된 파일을 얻을 수 있지만 중복은 유지됩니다.
$ cat file1 <(sed '0,/overlap2/d' file2)
a
b
b
overlap1
overlap2
p
q
q
이는 잘 작동하며 대부분의 경우 작동할 것입니다.
하지만 조심하세요! 중복된 내용이 있는 경우 모든 중복 내용이 제거되지는 않습니다. 관찰하다:
$ cat evil1
a
b
overlap1
overlap2
overlap3
overlap1
overlap2
$ cat evil2
overlap1
overlap2
overlap3
overlap1
overlap2
p
overlap2
q
첫 번째 파일의 마지막 줄을 결정합니다.
$ tail -n1 evil1
overlap2
두 번째 파일에서 첫 번째 항목 제거
$ sed '0,/overlap2/d' evil2
overlap3
overlap1
overlap2
p
overlap2
q
중복된 항목이 있는 경우 첫 번째 항목만 제거해도 모든 중복 항목이 제거되지는 않습니다. 하지만 잘못된 줄로 인해 overlap2
마지막 항목도 삭제할 수 없습니다.
그렇다면 최대 겹침을 결정하는 방법은 무엇입니까? 먼저 file2의 file1에서 마지막 줄이 나타나는 것을 모두 찾습니다. 각 발생에 대한 중복을 테스트합니다. 그런 다음 여전히 겹치는 마지막 이벤트를 가져옵니다.
모든 항목 찾기
$ grep -n overlap2 evil2
2:overlap2
5:overlap2
7:overlap2
각각이 겹치는지 테스트
$ diff -q <(tail -n2 evil1) <(head -n2 evil2)
$ diff -q <(tail -n5 evil1) <(head -n5 evil2)
$ diff -q <(tail -n7 evil1) <(head -n7 evil2)
Files /dev/fd/63 and /dev/fd/62 differ
출력이 없다는 것은 차이가 없다는 것을 의미합니다. 두 선이 겹칩니다. 다섯 가지 요소도 겹칩니다. 그러나 일곱 줄은 더 이상 겹치지 않습니다. 이는 행 5의 발생이 최대 중첩인 반면 행 7의 발생은 중첩과 무관함을 의미합니다.
$ cat evil1 <(sed '1,5d' evil2)
a
b
overlap1
overlap2
overlap3
overlap1
overlap2
p
overlap2
q
말했듯이 이것은 자동화될 수 있지만 노력을 기울이지 않았습니다.
관련 xkcd:https://xkcd.com/974/
적어도 나는 이 대답에 노력을 기울였습니다. 즐기다.
답변2
순서가 중요하지 않은 경우 다음 명령을 사용하여 작업을 완료할 수 있습니다.
sort -u FILE1 FILE2 > FILE3
파일 순서가 중요한 경우 다음 명령을 사용하십시오.
cat -n FILE1 FILE2 | sort -uk2 | sort -nk1 | cut -f2- > FILE3