두 개의 파일이 있는데 각각 동일한 줄 수를 가지고 있습니다.
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
필요에 따라 출력을 조정할 수 있습니다.