내 목표는 이 두 파일을 하나로 병합하는 것입니다. 첫 번째 항목이 두 번째 파일에 있으면 먼저 읽고, 복사가 아닌 경우 업데이트하십시오.
- 첫 번째 파일
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
대신 위치 인수로 해석하도록 했습니다. 프로그램을 항상 작은따옴표로 묶어야 합니다 .awk
awk
'
a
a.txt
를 기반으로 해야 한다고 명시했지만 에서 "대체 값 목록"(배열에 저장됨)을 작성하고 있습니다b.txt
.a[$1]=$1
이 목록( ) 의 첫 번째 필드만 저장하는 반면, 사본(예: )의 전체 행을 저장해야 합니다 .b.txt
a.txt
a[$1]=$0
- 에 "키"(첫 번째 항목)가 나타나면 의 첫 번째 필드만 의 해당 행으로
b.txt
바꾸지만 전체 행을 바꿔야 합니다(예: 대신 ).a.txt
b.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