두 파일의 n번째 줄마다 비교하고 (비대칭) 컨텍스트를 저장합니다.

두 파일의 n번째 줄마다 비교하고 (비대칭) 컨텍스트를 저장합니다.

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행)를 저장하고 싶습니다. line3Record1은 무시되고 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공백으로 구분된 전체 레코드를 읽게 합니다. 필드 구분 기호를 개행 문자( )로 설정하면 그 안에 전체 행을 저장하고 다른 행과 비교할 수 있습니다. 동일하지 않으면 기본적으로 출력이 인쇄됩니다(의 전체 레코드).fileAgetlinefileB\n$3$0getlinefileB

답변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

관련 정보