Shell 当不同文件的列数不同时,如何使用unix命令附加CSV文件

Shell 当不同文件的列数不同时,如何使用unix命令附加CSV文件,shell,unix,csv,append,Shell,Unix,Csv,Append,我有几千个csv文件,每个文件都有不同的列标题集。我现在正在使用python熊猫添加它们。我想知道是否有一种在UNIX中附加这些文件的有效方法 比如说 CSV1: Column1,Column2, Column3, Column4, Column5 1,aaa,bbb,0,NULL 2,aa1,bb1,,NULL CSV2: Column1,Column2, Column6, Column7, Column8 1,aaa,xyz,0,NULL 2,aa1,zy1,test-2,NULL

我有几千个csv文件,每个文件都有不同的列标题集。我现在正在使用python熊猫添加它们。我想知道是否有一种在UNIX中附加这些文件的有效方法

比如说

CSV1:

Column1,Column2, Column3, Column4, Column5
1,aaa,bbb,0,NULL
2,aa1,bb1,,NULL

CSV2:

Column1,Column2, Column6, Column7, Column8
1,aaa,xyz,0,NULL
2,aa1,zy1,test-2,NULL


Required Output

Column1,Column2, Column3, Column4, Column5,Column6, Column7, Column8
1,aaa,bbb,0,NULL,,,
2,aa1,bb1,,NULL,,,,
1,aaa,,,,xyz,0,NULL
2,aa1,,,,zy1,test-2,NULL
完成附加两个文件时,应将值与相应的列名对齐,并且应将第二个文件的头适当地附加到最终输出头上,且无重复项

awk -F, -v OFS="," 'FNR==NR{a[$1$2]=$0;next}($1$2 in a){x=$1$2;$1=$2="";gsub(/^,*/,"");print a[x]","$0}' file1 file2
测试如下:

> cat temp2
Column1,Column2, Column3, Column4, Column5
1,aaa,bbb,0,NULL
2,aa1,bb1,,NULL
> 
> 
> cat temp
Column1,Column2, Column6, Column7, Column8
1,aaa,xyz,0,NULL
2,aa1,zy1,test-2,NULL
> 
> 
> awk -F, -v OFS="," 'FNR==NR{a[$1$2]=$0;next}($1$2 in a){x=$1$2;$1=$2="";gsub(/^,*/,"");print a[x]","$0}' temp2 temp
Column1,Column2, Column3, Column4, Column5, Column6, Column7, Column8
1,aaa,bbb,0,NULL,xyz,0,NULL
2,aa1,bb1,,NULL,zy1,test-2,NULL
> 

join-t,-11-21-o1.1-o1.2-o1.3-o1.4-o1.5-o2.3-o2.4-o2.5 CSV1 CSV2

这似乎是一个更好的方法

&您还可以使用
cut
,如下所示

cat CSV2 |切割-f 1,3,4,5-d,>tmp1


join-t','-j1csv1tmp1

您好,谢谢您的建议。但它不能产生所需的输出。它包含Id值1和2上两行的值。相反,我希望看到两个不同csv文件中的每一行都有不同的行,但它们必须确保附加列在最终输出中正确对齐。您能帮助我了解第一个join命令的作用吗?对于使用cut的建议,我不知道要分别剪切的列字段。如果我不知道每个文件中的列数,该怎么办?
-t
表示分隔符by
-1 1
表示将file1的第一个字段加入到file2的第一个字段中
-o
表示输出,
1.1
表示文件1的第一个字段;因此,如果您不知道克隆的数量,那么您可以加入该文件并通过
awk
命令搜索某种方法来删除重复的字段;或者只编写一个简单的shell来生成该列表。:)