2개의 CSV 파일의 데이터 비교

2개의 CSV 파일의 데이터 비교

3개의 파일이 있습니다.

file1다음과 같은 데이터가 있습니다 .

id,name,age
1,jj,60
2,kk,45
3,ss,56

file2다음과 같은 데이터가 있습니다 .

id,name,age
1,jj,60
2,kk,44
3,ss,55
4,tt,66

file3필드가 하나뿐입니다. ID는 다음과 같습니다 .

id
1
2
3

file1이제 & file2의 해당 ID를 비교하고 싶습니다 file3.

출력은 다음과 같아야 합니다.

id  file1   file2
2   age=45  age=44
3   age=56  age=55

답변1

확장하다paste+awk해결책:

awk -F',' -v ids=$(paste -s -d'|' <(tail -n+2 file3)) \
'BEGIN{ OFS="\t"; print "id", ARGV[1], ARGV[2] }
 FNR==1{ next }
 NR==FNR{ if ($1 ~ "^("ids")$") a[$1$2]=$3; next }
 ($1$2 in a) && a[$1$2] != $3{ 
     printf "%d\tage=%d\tage=%d\n", $1, a[$1$2], $3 
 }' file1 file2

산출:

id  file1   file2
2   age=45  age=44
3   age=56  age=55

답변2

Roman의 답변은 훌륭하며 요청한 정확한 결과를 제공합니다.

그러나 만약 당신이오직원시 데이터가 필요합니다(즉, CSV 헤더가 없고 printf 도 없고 인쇄된 형식). paste+++를 사용할 수 있습니다 .commgrep프로세스 교체:

$ paste <(comm -1 -3 file1 file2) <(comm -2 -3 file1 file2) | 
    grep -f <(sed -e 's/^/^/; s/$/,/;' file3)
2,kk,44 2,kk,45
3,ss,55 3,ss,56

설명하다:

comm -1 -3 file1 file2고유 라인을 출력합니다 file2. comm -2 -3 file1 file2고유 라인을 출력합니다 file1. 두 명령의 출력은 paste프로세스 대체를 통해 제공되고 함께 연결됩니다.

paste그런 다음 의 출력은 grep으로 파이프되어 에 나열된 ID와 일치하는 행만 출력됩니다 file3. 여기서는 프로세스 대체를 사용하여 file3에 나열된 ID를 줄의 시작 부분에 있고 뒤에 쉼표가 있는 경우에만 ID 번호와 일치하는 고정된 정규식으로 변환합니다.

추가 처리를 원하거나 필요로 하는 경우 다음과 같은 작업을 수행하는 것이 가장 유용합니다.앞으로예쁜 인쇄물.

관련 정보