使用 AWK 将两个 CSV 文件合并为一个

使用 AWK 将两个 CSV 文件合并为一个

我正在尝试使用 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']=5a['jessica']=9

  • $1 in a{$3=a[$1]}

    读取时file1.csv,如果第一个字段作为数组中的键存在a,则将第三个字段更新为存储在 中的值a

    如果(我们正在读取的)$1 in a内容是其中之一,则测试为真$1file1.csv(不是值之一) array a

  • 1

    这是 的简写{print}

  • OFS=,

    这将输出字段分隔符设置为逗号。

相关内容