AWK를 사용하여 두 개의 CSV 파일을 병합하려고 합니다. file1의 첫 번째 열이 file2의 첫 번째 열과 일치하면 file1의 세 번째 열을 file2의 두 번째 열 값으로 변경하고 싶습니다. 일치하는 항목이 없으면 변경하지 않고 다음 행으로 이동합니다.
파일 1.csv
alice,soccer,24
bob,baseball,21
jessica,swimming,22
mike,running,20
파일 2.csv
alice,5
jessica,9
원하는 출력:
alice,soccer,5
bob,baseball,21
jessica,swimming,9
mike,running,20
지금까지 내 코드는 다음과 같습니다.
#!/bin/bash
awk -F"," 'BEGIN{OFS=","}
{ if (NR==NFR){
array[$1]=$1;
}
if ( $1 in array ){
$3=array[$2]
}
print
}' file2.csv file1.csv
답변1
노력하다:
$ awk -F, 'FNR==NR{a[$1]=$2;next} $1 in a{$3=a[$1]} 1' OFS=, file2.csv file1.csv
alice,soccer,5
bob,baseball,21
jessica,swimming,9
mike,running,20
어떻게 작동하나요?
-F,
그러면 입력 필드 구분 기호가 쉼표로 설정됩니다.
FNR==NR{a[$1]=$2;next}
읽으면
file2.csv
배열의 첫 번째 필드 키 아래에 두 번째 필드가 저장됩니다a
.의 사용에 유의하세요
next
. 이는 awk에게 나머지 명령을 건너뛰고 다음 줄에서 시작하도록 지시합니다.예를 들어, 을 읽은 후
file2.csv
배열의 내용은 및a
입니다 .a['alice']=5
a['jessica']=9
$1 in a{$3=a[$1]}
읽을 때
file1.csv
첫 번째 필드가 배열의 키로 존재하는 경우a
세 번째 필드는 에 저장된 값으로 업데이트됩니다a
.(우리가 읽고 있는) 내용이
$1 in a
다음 중 하나 이면 테스트는 참입니다.$1
file1.csv
열쇠(값 중 하나가 아님) arraya
.1
의 약어입니다
{print}
.OFS=,
그러면 출력 필드 구분 기호가 쉼표로 설정됩니다.