![使用 AWK 将两个 CSV 文件合并为一个](https://linux22.com/image/176614/%E4%BD%BF%E7%94%A8%20AWK%20%E5%B0%86%E4%B8%A4%E4%B8%AA%20CSV%20%E6%96%87%E4%BB%B6%E5%90%88%E5%B9%B6%E4%B8%BA%E4%B8%80%E4%B8%AA.png)
我正在尝试使用 AWK 合并两个 csv 文件。如果文件 1 中的第一列与文件 2 中的第一列匹配,我想将 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=,
这将输出字段分隔符设置为逗号。