두 파일을 한 줄씩 비교

두 파일을 한 줄씩 비교

두 개의 파일이 있는데 각각 동일한 줄 수를 가지고 있습니다.

1.txt

1,2,1,1
1,2,2,1
1,2,4,2
1,2,1,2

2.txt

1,2,1,2
1,2,2,1
1,2,4,1
1,2,1,1

이제 한 줄씩, 첫 번째 줄과 첫 번째 줄, 두 번째 줄과 두 번째 줄 등을 비교하고 첫 번째 파일(1.txt)을 두 번째 파일(2.txt)과 인쇄하고 싶습니다. 의 해당 행 TXT).

이 경우 출력은 다음과 같습니다.

1,2,1,1
1,2,4,2
1,2,1,2

답변1

awk를 사용하세요:

awk 'NR==FNR{a[$0];next}(!($0 in a)){print}' file2 file1

NR==FNR{a[$0];next}: 키 = 전체 줄인
첫 번째 파일(file2)에 대한 배열을 만든 후 다음 줄로 이동합니다. NR은 awk의 전역 레코드 번호이고, FNR은 현재 파일 레코드 번호입니다. NR==FNR 조건은 첫 번째 파일 읽기(파일 2)에만 유효합니다.a$0

(!($0 in a){print}:
첫 번째 file2가 완료되면 file1을 읽고, file1의 전체 행이 $0배열의 키에 속하지 않으면 a이 행을 인쇄합니다.

grep을 사용하세요:

grep -vxF -f file2 file1

-v: 일치하지 않는 줄 캡처
-x: 전체 줄 일치
-F: 패턴 일치 대신 고정 일치 수행
-f: file2를 사용하여 패턴 로드

업데이트된 데이터의 경우한 줄씩 비교하려면 grep 대신 awk를 사용하면 됩니다.

awk 'NR==FNR{a[FNR]=$0;next}$0!=a[FNR]{print}' file2 file1
1,2,1,1
1,2,4,2
1,2,1,2

분명히 두 파일 모두 동일한 수의 줄을 가져야 합니다.

답변2

간단한 comm(두 개의 정렬된 파일을 한 줄씩 비교) 접근 방식:

comm -2 -3 1.txt 2.txt

산출:

1,2,1,2
1,2,3,3

  • -2- 열 억제 2(행만 FILE2)

  • -3- 열 억제 3(두 파일 모두에 나타나는 행)


입력 파일이 정렬되지 않은 경우 다음 명령을 사용하십시오.

comm -2 -3 <(sort 1.txt) <(sort 2.txt)

----------

diff옵션이 있는 도구를 사용하는 대체 솔루션 --LTYPE-line-format=LFMT:

diff --unchanged-line-format="" --old-line-format="%L" --new-line-format="" 1.txt 2.txt
  • --unchanged-line-format=""- 인쇄 공통선 제거

  • --new-line-format=""- 두 번째 파일에서 인쇄 줄 제거

  • --old-line-format="%L"- 첫 번째 파일의 주요 라인을 출력합니다.

답변3

간단히 diff 명령을 사용하십시오.

 diff --suppress-common-lines -n file1 file2

예제 파일의 경우 출력은 다음과 같습니다.

>diff file1 file2
2,3c2,3
< 1,2,1,2
< 1,2,3,3
---
> 1,2,1,1
> 1,2,3,1

<는 file1의 행을 나타냅니다.

>는 file2의 행을 나타냅니다.

= 두 파일 모두에 공통적인 지시어 줄

답변4

기본적으로 동일한 문제가 있습니다(파일 1의 줄뿐만 아니라 서로 다른 두 줄을 인쇄하려는 경우를 제외하고). 좋은 해결책을 찾았어요이 스레드.

wdiff <(nl file1) <(nl file2)

예제 출력:

...
77  true
78  false
79  [-true-]        {+false+}
80  [-true-]        {+false+}
...

여기서는 먼저 도구를 사용하여 nl두 파일의 줄에 번호를 매기 diff거나 wdiff번호별로 쌍을 이룹니다. 그런 다음 다양한 옵션을 사용 diff하고 wdiff필요에 따라 출력을 조정할 수 있습니다.

관련 정보