AWK를 사용하여 두 개의 txt 파일을 하나로 병합하고 누락된 항목 추가

AWK를 사용하여 두 개의 txt 파일을 하나로 병합하고 누락된 항목 추가

내 목표는 이 두 파일을 하나로 병합하는 것입니다. 첫 번째 항목이 두 번째 파일에 있으면 먼저 읽고, 복사가 아닌 경우 업데이트하십시오.

  • 첫 번째 파일a.txt
    AAA;2020-09-01;Y
    BBB;2020-09-01;Y
    CCC;2020-09-01;Y
    
  • 두 번째 파일b.txt
    AAA;2020-09-01;Y;21/08/2020
    BBB;2020-09-01;Y
    
  • 원하는 결과c.txt
    AAA;2020-09-01;Y;21/08/2020
    BBB;2020-09-01;Y
    CCC;2020-09-01;Y
    

이 코드를 시도했지만 결과에 CCC원본 데이터가 누락되었습니다. 이 문제를 어떻게 해결할 수 있습니까?

gawk -F, "FNR==NR{a[$1]=$1;next} $1 in a{$1=a[$1]} 1" OFS=, a.txt b.txt > c.txt

답변1

접근 방식의 문제점은 다음과 같습니다.

  • ,파일이 ;-로 구분되어 있지만 필드 구분 기호로 지정했습니다.
  • "쉘이 프로그램을 필드로 해석하는 $1대신 위치 인수로 해석하도록 했습니다. 프로그램을 항상 작은따옴표로 묶어야 합니다 .awkawk'
  • aa.txt를 기반으로 해야 한다고 명시했지만 에서 "대체 값 목록"(배열에 저장됨)을 작성하고 있습니다 b.txt.
  • a[$1]=$1이 목록( ) 의 첫 번째 필드만 저장하는 반면, 사본(예: )의 전체 행을 저장해야 합니다 .b.txta.txta[$1]=$0
  • 에 "키"(첫 번째 항목)가 나타나면 의 첫 번째 필드만 의 해당 행으로 b.txt바꾸지만 전체 행을 바꿔야 합니다(예: 대신 ).a.txtb.txt$0=a[$1]$1=a[$1]

그래서 다음과 같은 것을 찾고 있는 것 같습니다.

gawk -F';' 'FNR==NR{a[$1]=$0; next} ($1 in a) {$0=a[$1]} 1' b.txt a.txt > c.txt

관련 정보