使用 awk 或 sed 根据公共列合并两个 csv 文件

Sru*_*ddy 5 unix linux bash awk sed

我有一个两个 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
Run Code Online (Sandbox Code Playgroud)

CSV 文件 2

Type1 445566,Name XYZ11
Type1 445577,Name AAA22
Type1 445588,Name BBB33
Type1 445566,Name XYZ11
Run Code Online (Sandbox Code Playgroud)

我想要的是?

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
Run Code Online (Sandbox Code Playgroud)

那么Linux/Unix中有没有bash命令可以实现这一点呢?我们可以使用 awk 或 sed 来完成此操作吗?

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

尝试了以下命令:

命令:

粘贴 -d, <(剪切 -d, -f 1-2 ./test1.csv | sed 's/$/,Type1/') test2.csv

得到结果:

20 年 5 月 1 日,用户,类型 1,类型 1 445566,名称 XYZ11

Tha*_*ded 7

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

join -t, -o 1.1 1.2 1.3 2.1 2.2 -1 4 -2 1 file1.csv file2.csv
Run Code Online (Sandbox Code Playgroud)

解释:

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

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

-1 4按 file1 中的第 4 列连接

-2 1按 file2 中的第 1 列连接

有关附加的使用信息join,请参考join 联机帮助页。

编辑:您特别要求使用awk以下解决方案,sed因此这里是awk实现:

awk -F"," 'NR==FNR {a[$1] = $2; next} {print $1","$2","$3","$4"," a[$4]}' \
    file2.csv \
    file1.csv
Run Code Online (Sandbox Code Playgroud)

解释:

-F","用逗号字符分隔

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

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

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


Enr*_*lis 0

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

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

实际上sed可以完成 的整个处理file1,并且输出可以被分成paste,它用于-从标准输入中捕获它:

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