Linux 使用awk根据多列将两个csv文件左外连接,同时保持第一个文件的顺序

Linux 使用awk根据多列将两个csv文件左外连接,同时保持第一个文件的顺序,linux,awk,left-join,Linux,Awk,Left Join,我有两个csv文件 文件1 ID,Name,Gender,Salary,DOB 11,Jim,M,200,90 12,David,M,100,89 12,David,M,300,89 13,Lucy,F,150,86 14,Lily,F,200,85 13,Lucy,F,100,86 文件2 DOB,Name,Children 90,Jim,2 88,Michael,4 88,Lily,1 85,Lily,0 我想做的是根据DOB和Name将文件2外部连接到文件1中,同时保持文件1观察的顺序

我有两个csv文件

文件1

ID,Name,Gender,Salary,DOB
11,Jim,M,200,90
12,David,M,100,89
12,David,M,300,89
13,Lucy,F,150,86
14,Lily,F,200,85
13,Lucy,F,100,86
文件2

DOB,Name,Children
90,Jim,2
88,Michael,4
88,Lily,1
85,Lily,0
我想做的是根据DOB和Name将文件2外部连接到文件1中,同时保持文件1观察的顺序。 因此,预计产出将是

ID,Name,Gender,Salary,DOB,Children
11,Jim,M,200,90,2
12,David,M,100,89,
12,David,M,300,89,
13,Lucy,F,150,86,
14,Lily,F,200,85,0
13,Lucy,F,100,86,
我了解到,如果使用join命令,我们需要对数据进行排序。所以我想知道我是否可以用awk来做我的工作。但我是awk的新手。有人能帮我吗?顺便问一下,如果数据非常大,我可以在awk中删除print命令,但只需使用>*.csv保存到新的csv文件中吗?这是因为我在这个网站上找到了一些相关问题的解决方案,经常使用{print…}。谢谢你。

祝你救援成功

$ awk -F, 'NR==FNR{a[$1,$2]=$3; next} {print $0 FS a[$NF,$2]}' file2 file1

ID,Name,Gender,Salary,DOB,Children
11,Jim,M,200,90,2
12,David,M,100,89,
12,David,M,300,89,
13,Lucy,F,150,86,
14,Lily,F,200,85,0
13,Lucy,F,100,86,

join将需要排序输入,并且您需要修饰以恢复初始顺序。您可以通过添加>outputfile.csv将输出重定向到文件中

是否可以保证文件1中的name+dob组合是唯一的?是数据的空白部分,或者只是为了格式化。如果是这样,最好公布实际数据。还有,标题是文件的一部分吗?如果是,为什么不用逗号分隔?如果您发布可以复制粘贴的示例文件,以测试最有用的脚本。Name+dob不需要是唯一的。它们可以重复发生。在文件2中,它是唯一的。我已经修改了我的样品。谢谢。多大是非常大?像2 TB。这只是一个假设。如果有太多的观察,print将使所有obs都充满linux窗口。谢谢你,karakfa。成功了。我有一个大问题。假设文件2有四列,分别是DOB、Name、Children和Class。我试图模仿您的代码,并在linux中键入“`awk-F',NR==FNR{a[$1,$2]=$3,$4;next}{print$0fs a[$NF,$2]}`”。但它警告了一个语法错误。我该怎么办?谢谢你,我想我是自己弄明白的。我输入了awk-F,'NR==FNR{a[$1,$2]=$3fs$4;接下来}{print$0fs a[$NF,$2]}。