정렬되어 있고 대부분 유사한 줄을 포함하는 file1
2 개의 파일이 있습니다 . 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