2개의 쉼표로 구분된 파일을 비교하고 차이점을 출력합니다.

2개의 쉼표로 구분된 파일을 비교하고 차이점을 출력합니다.

공통 열에 있는 두 개의 유사한 파일을 비교하고 차이점을 출력하고 싶습니다. 이러한 파일은 동일한 헤더를 갖습니다. 특정 열의 차이점을 확인하고 싶습니다.

두 번째 파일 File2에는 추가 행이 있을 수 있지만 file1 열-Column2 값과 file2 열-Column2 값의 일치를 비교하고 Column3 값에 차이가 있으면 인쇄하고 싶습니다.

파일 1

Column1,Column2,Column3
Demosvc1,Demopod1,70647625e1b016f8c2b21eae7465b30e0b0375ea
Demosvc2,Demopod2,<none>
Demosvc3,Demopod3,0b12b9218e1a572e994a6b616059a618e8f5d9a0
Demosvc4,Demopod4,ca9802f0636c23d20daad17498b26df000205626
Demosvc6,Demopod6,ca9802f0636c23d20daad17498b26df000205626

파일 2

Column1,Column2,Column3
Demosvc1,Demopod1,70647625e1b016f8c2b21eae7465b30e0b0375ea
Demosvc2,Demopod2,20fd5948a80c5b06989f34b1c23a8e64afb7943e
Demosvc3,Demopod3,0b12b9218e1a572e994a6b616059a618e8f5d9a0
Demosvc4,Demopod4,551fbe73e835528da8269bac3652c6a64ecf4097
Demosvc5,Demopod5,4ae6230593c13b3a50e7b8e6cf0fe5fcc4a0fda2
Demosvc6,Demopod6,ca9802f0636c23d20daad17498b26df000205626

차이점을 이렇게 인쇄하고 싶습니다.

원하는 출력

Demopod2,<none>,20fd5948a80c5b06989f34b1c23a8e64afb7943e
Demopod4,ca9802f0636c23d20daad17498b26df000205626,551fbe73e835528da8269bac3652c6a64ecf4097

답변1

awk -F',' '{
  if (NR==FNR) a[$1$2]=$3
  else if (a[$1$2]!="" && a[$1$2]!=$3) print $2","a[$1$2]","$3
}' file1 file2

a첫 번째 파일을 처리할 때 첫 번째 및 두 번째 필드를 키로 사용하여 세 번째 필드의 값을 배열에 저장합니다 .

두 번째 파일을 처리할 때 세 번째 필드의 값과 일치하지 않는 비어 있지 않은 배열 값에 대한 키를 비교하십시오. 이 경우 두 번째 필드, 배열 값 및 세 번째 필드를 인쇄하십시오.

답변2

밀러 사용(https://github.com/johnkerl/miller) 당신은 실행할 수 있습니다

mlr --headerless-csv-output --csv join --lp l_ --rp r_ -f input_01.csv -j Column2 then \
    cut -f Column2,l_Column3,r_Column3 then \
    filter '$l_Column3!=$r_Column3' \
input_02.csv

얻다

Demopod2,<none>,20fd5948a80c5b06989f34b1c23a8e64afb7943e
Demopod4,ca9802f0636c23d20daad17498b26df000205626,551fbe73e835528da8269bac3652c6a64ecf4097

몇 가지 참고사항:

  • join --lp l_ --rp r_ -f input_01.csv -j Column2연결 및 출력의 출력 필드 접미사 이름을 설정합니다.
  • cut -f Column2,l_Column3,r_Column3Column2와 왼쪽, 오른쪽 Column 3 추출
  • filter '$l_Column3!=$r_Column3'왼쪽 Column3이 오른쪽 Column3과 같지 않은 모든 행을 필터링합니다.

답변3

join --header -j2 -t, -o 1.2,1.3,2.3 FILE1 FILE2
  • --header 첫 번째 줄을 헤더로 처리
  • -j2 열 2에 조인
  • -t에 별도의 열,
  • -o ... 파일1-열2 파일1-열3 파일2-열3을 인쇄합니다.

참고: join조인 필드에서 입력 파일을 정렬해야 합니다.

관련 정보