"수정된 줄"을 고려하면서 두 파일 간의 줄 차이를 어떻게 표시할 수 있습니까?

"수정된 줄"을 고려하면서 두 파일 간의 줄 차이를 어떻게 표시할 수 있습니까?

정렬되어 있고 대부분 유사한 줄을 포함하는 file12 개의 파일이 있습니다 . file2이 두 파일 사이에 추가/수정/억제된 줄을 표시하고 싶습니다.

문제는 "행 수정"의 정의입니다. 명령에 대한 입력으로 전달할 수 있기를 원합니다.

예를 들어, 다음 2개 파일(및 원본 줄 형식은 텍스트 뒤에 콜론과 숫자가 따르며, 수정된 2개 줄은 텍스트는 동일하지만 숫자가 다른 특징이 있음)이 제공됩니다.

파일 1

product1:4
product2:5
product3:6

파일 2

product1:7
product3:6
product4:9

나는 (어떤 형식으로든) 나에게 다음과 같은 결과를 제공하고 싶습니다.

  • 1줄 추가됨:product4:9
  • 행 1개가 삭제되었습니다.product2:5
  • 1줄이 수정 product1:4되었습니다 .product1:7
  • (그리고 행 1은 변경되지 않습니다 product3:6. :)

이것이 단일 명령의 출력인지 아니면 다른 명령의 출력인지, 둘 중 더 간단한 것은 상관없습니다.

다음 공식이 유지되어야 합니다.

(number of lines of file1) + (number of added lines) - (number of suppressed lines) = (number of lines of file2) 

편집: 위의 예에서 프로그램에 제공되는 정규식 입력은 ^(.+):[:digit:]+$각 줄의 콜론 앞의 텍스트를 추출하고 추출된 텍스트를 사용하여 한 줄이 다른 줄과 유사한지 확인하는 것입니다.

  • 주어진 두 줄이 다르지만 추출된 텍스트가 동일한 경우 해당 줄은 수정된 것으로 간주됩니다.
  • 주어진 2개의 라인이 다르고 추출된 텍스트가 다른 경우 해당 라인은 제거되고 추가된 것으로 간주됩니다.

답변1

키/값 쌍 세트가 있고 키를 기반으로 추가, 삭제 및 수정된 행을 정의하는 경우 이는 그리 어렵지 않습니다. 예를 들어 with를 구분 기호로 사용하면 awk다음과 :같습니다.

$ $ awk -F: '{ if(NR==FNR){old[$1]=$2; line[$1]=$0} else{ seen[$1]++; if($1 in old){ if (old[$1] != $2){printf "Modified: %s became %s\n",line[$1],$0}else{print "Same: "$0}}else{print "Added: "$0}}}END{for(key in old){ if(!seen[key]){print "Deleted: "line[key]}}}' file1  file2 
Modified: product1:4 became product1:7
Same: product3:6
Added: product4:9
Deleted: product2:5

이해하기 쉬운 동일한 내용은 다음과 같습니다.

awk -F: '
  { 
    if(NR==FNR){ 
        old[$1]=$2; 
        line[$1]=$0
    } 
    else{ 
        seen[$1]++; 
        if($1 in old){ 
            if (old[$1] != $2){
                printf "Modified: %s became %s\n",line[$1],$0
            }
            else{
                print "Same: "$0
            }
        }
        else{
            print "Added: "$0
        }
    }
  }
  END{
    for(key in old){ 
        if(!seen[key]){
            print "Deleted: "line[key]
        }
    }
}' file1  file2 

관련 정보