【问题标题】:combine two csv files based on common column using awk or sed [duplicate]使用 awk 或 sed 基于公共列组合两个 csv 文件 [重复]
【发布时间】:2020-08-30 05:25:33
【问题描述】:

我有一个两个 CSV 文件,两个文件中有一个公共列,一个文件中有重复项。如何使用 awk 或 sed 合并两个 csv 文件?

CSV 文件 1

5/1/20,user,mark,Type1 445566
5/2/20,user,ally,Type1 445577
5/1/20,user,joe,Type1 445588
5/2/20,user,chris,Type1 445566

CSV 文件 2

Type1 445566,Name XYZ11
Type1 445577,Name AAA22
Type1 445588,Name BBB33
Type1 445566,Name XYZ11

我想要的是什么?

5/1/20,user,mark,Type1 445566,Name XYZ11
5/2/20,user,ally,Type1 445577,Name AAA22
5/1/20,user,joe,Type1 445588,Name BBB33
5/2/20,user,chris,Type1 445566,Name XYZ11

那么在 Linux/Unix 中是否有一个 bash 命令来实现这一点?我们可以使用 awk 或 sed 做到这一点吗?

基本上,我需要将 CSV 文件 1 的第 4 列与 CSV 文件 2 的第 1 列相匹配,然后合并两个 csv。

尝试了以下命令:

命令:

粘贴 -d,

得到结果:

5/1/20,user,Type1,Type1 445566,名称 XYZ11

【问题讨论】:

    标签: linux bash unix awk sed


    【解决方案1】:

    如果您能够安装join 实用程序,则此命令有效:

    join -t, -o 1.1 1.2 1.3 2.1 2.2 -1 4 -2 1 file1.csv file2.csv
    

    说明:

    -t,将字段分隔符标识为逗号(',')

    -o 1.1 1.2 1.3 2.1 2.2 将输出格式化为“file1col1, file1col2, file1col3, file2col1, file2col2`

    -1 4 按文件 1 中的第 4 列加入

    -2 1 按文件 2 中的第 1 列加入

    有关join 的更多使用信息,请参考the join manpage

    编辑:您特别要求使用awksed 的解决方案,所以这里是awk 实现:

    awk -F"," 'NR==FNR {a[$1] = $2; next} {print $1","$2","$3","$4"," a[$4]}' \
        file2.csv \
        file1.csv
    

    解释

    -F","以逗号分隔

    NR==FNR读取第一个文件参数(注意在上面的解决方案中,我们首先传递了file2)

    {a[$1] = $2; next}在当前文件中,将Column2的内容保存在一个以Column1为key的数组中

    {print $1","$2","$3","$4"," a[$4]} 读取 file1 并使用 Column4,将值与数组中的键值匹配。打印 Column1、Column2、Column3、Column4 和键的值。

    【讨论】:

    • 我不知道join-o 选项!非常感谢:D。
    【解决方案2】:

    这两个示例输入文件似乎已经正确排序,因此您只需将它们并排放置即可,paste 很适合;但是您想从file1 中删除一些, 分隔的列,您可以为此使用cut;但是您还想插入另一个(常量)列,sed 可以做到。一个可能的命令是这样的:

    paste -d, <(cut -d, -f 1-2 file1 | sed 's/$/,abcd/') file2
    

    其实sed可以做file1的全部处理,输出可以pid化到paste,使用-从标准输入中捕获:

    sed -E 's/^(([^,]+,){2}).*/\1abcd/' file1 | paste -d, - file2
    

    【讨论】:

    • 感谢@Enrico Maria De Angelis 的及时回复。通过仅粘贴文件 2 列将不起作用,我之前尝试过。我正在尝试的是,通过将文件 2 的第 2 列与文件 1 的第 4 列和文件 2 的第 1 列匹配来提取它
    • @Srujanreddy 你有没有在你在这里提供的两个文件上尝试过我的命令?
    • 我已经尝试了你的命令,稍作改动,它给了我这样的结果 使用的命令:粘贴 -d,
    • @Srujanreddy 避免将代码放入 cmets。而是更新问题,尤其是在您必须提供更相关的输入和输出时。
    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-08-01
    • 1970-01-01
    • 2015-11-07
    • 2021-07-17
    相关资源
    最近更新 更多