파일이 2개 있는데,
파일 1->
abc=3
abc=3
dfg=6
ggg=7
파일 2->
abc=3
dfg=4
sdf=9
file3의 출력이 다음과 같기를 원합니다.
File2,File1,Result
abc=3,abc=3,Match
dfg=4,dfg=6,NoMatch
sdf=9,,NotPresent
,abc=3,Duplicate
나는 현재 다음과 같은 스크립트를 가지고 있습니다.
grep -E 'abc|dfg|sdf' file1 >> file3
comm <( sort -n file2 ) <( sort -n file3 ) |awk -F$'\t' 'BEGIN { OFS="," } $3 { print $3, $3, "MATCH"; next } { print $1, $2, "NO MATCH" }' > final_result.txt
출력은 다음과 같습니다.
abc=3,abc=3,MATCH
,abc=3,NO MATCH
dfg=4,,NO MATCH
,dfg=6,NO MATCH
sdf=9,,NO MATCH
file2의 값이 file1의 값과 일치하지 않으면 출력이 공백이 됩니다. 예를 들어 dfg=4,,NO MATCH와 dfg=6,NO MATCH의 유일한 차이점은 값이 4에서 6으로 변경되었다는 것입니다. 나는 출력을 원한다.
dfg=4,dfg=6,NoMatch
바꾸다
dfg=4,,NO MATCH
,dfg=6,NO MATCH
그리고,
abc=3
두 번 나타나지만 다음과 같이 나타납니다.
,abc=3,NO MATCH
나는 그것을 원한다.
abc=3,,Duplicate
어떤 도움이라도 대단히 감사하겠습니다.
답변1
bash-4.1$ cat file1
abc=3
abc=3
dfg=6
ggg=7
bash-4.1$ cat file2
abc=3
dfg=4
sdf=9
bash-4.1$ awk 'NR==FNR{split($0,B,"=");Brr[B[1]]=$0;Arr[$0]++;next}($0 in Arr){print $0","$0",Match";next}split($0,C,"=")(C[1] in Brr){print Brr[C[1]]","$0",NoMatch"}END{for (i in Arr)if(Arr[i]>1){print i",,Duplicate"}}' file1 file2
abc=3,abc=3,Match
dfg=6,dfg=4,NoMatch
,sdf=9,NoMatch
abc=3,,Duplicate