2개의 파일이 있는데 각 파일에는 동일한 순서로 동일한 수의 4줄 레코드가 포함되어 있습니다.
fileA
:
record1 line1=header
record1 line2 X <= this is different but should be ignored
record1 line3 id ABC
record1 line4
record2 line1=header
record2 line2
record2 line3 id DEF <= this is different
record2 line4
fileB
:
record1 line1=header
record1 line2 Y <= this is different but should be ignored
record1 line3 id ABC
record1 line4
record2 line1=header
record2 line2
record2 line3 id GHI <= this is different
record2 line4
line3
각 레코드에 대해 두 파일 간의 상황을 비교하고, 다를 경우 위의 예에서 fileB의 전체 레코드(1-4행)를 저장하고 싶습니다. line3
Record1은 무시되고 Record2는 저장됩니다. 기본적인 지식은 있지만 diff
가능한지는 잘 모르겠습니다. 첫째, 세 번째 행만 비교하고 다른 행 -C
은 무시하는 방법을 모르겠습니다.대칭컨텍스트, 즉 차이 전후의 줄 수가 동일합니다.
UPD. 처음에는 예제에서 실수를 했습니다. 레코드 사이에 실제 파일에는 없는 빈 줄이 있었습니다. 그 점은 사과드립니다. @stteldriver의 답변을 바탕으로 다음과 같은 해결책이 있습니다.
awk '
NR%4==3 {
lineA3=$0;
getline lineB1 < "fileB";
getline lineB2 < "fileB";
getline lineB3 < "fileB";
getline lineB4 < "fileB";
if (lineA3 != lineB3) {printf "%s\n%s\n%s\n%s\n", lineB1,lineB2,lineB3,lineB4;}
}' fileA
완벽하게 작동합니다! 코드가 상당히 보기 흉하지만(이제 막 배우기 시작했습니다 awk
!) 최적화해 주시면 매우 감사하겠습니다.
답변1
4행의 레코드를 엄격하게 기반으로 하는 업데이트된 입력의 경우 모듈식 산술을 사용하여 현재 레코드의 배열을 유지하고 4번째 행마다 3행과 일치하는지 확인할 수 있습니다.
$ awk '
{a[FNR%4] = $0; getline b[FNR%4] < "fileB"}
!(FNR%4) && b[3] != a[3] {
for(i=0;i<4;i++) print b[i%4]
}
' fileA
record2 line1=header
record2 line2
record2 line3 id GHI <= this is different
record2 line4
(실제로 명령의 반환 값을 확인 getline
하고 실패할 경우 합리적인 조치를 취해야 합니다.)
원래 게시한 입력에 대해 다음을 사용할 수 있습니다.단락 모드:
$ awk -vRS= -F'\n' '{A3 = $3}; getline "fileB" > -1 && $3 != A3' fileA
record2 line1=header
record2 line2
record2 line3 id DEF <= this is different
record2 line4
(입력) 및 (입력)의 정상적인 처리를 위해 null은 RS
공백으로 구분된 전체 레코드를 읽게 합니다. 필드 구분 기호를 개행 문자( )로 설정하면 그 안에 전체 행을 저장하고 다른 행과 비교할 수 있습니다. 동일하지 않으면 기본적으로 출력이 인쇄됩니다(의 전체 레코드).fileA
getline
fileB
\n
$3
$0
getline
fileB
답변2
원하는 작업을 수행하는 Python 스크립트는 다음과 같습니다.
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
"""compare.py"""
import sys
file_A = open(sys.argv[1], "r")
file_B = open(sys.argv[2], "r")
records_A = file_A.read().split("\n\n")
records_B = file_B.read().split("\n\n")
for record_A, record_B in zip(records_A, records_B):
lines_A = record_A.split("\n")
lines_B = record_B.split("\n")
if lines_A[2] != lines_B[2]:
print("{}\n".format(record_B))
다음과 같이 실행할 수 있습니다.
python compare.py fileA fileB
샘플 데이터에 대해 실행하면 원하는 출력을 얻습니다.
record2 line1=header
record2 line2
record2 line3 id GHI <= this is different
record2 line4