要为该行的第一个单元格匹配的每一行追加从文件 1 到 3 的列,请创建一个新行,然后追加

要为该行的第一个单元格匹配的每一行追加从文件 1 到 3 的列,请创建一个新行,然后追加

我有四个 CSV 文件,如下所示;我想为该行的第一个单元格匹配的每一行添加从文件 1 到 3 的列,然后创建一个新行,然后追加。

文件1:

N,Mon,Tue,Wed
1,A,B,C
2,D,E,F
3,I,J,X

文件2:

N,Mon,Tue,Wed
3,D,E,F
5,O,P,q
1,D,E,K

文件3

N,Mon,Tue,Wed
2,B,E,J
6,L,D,O
3,I,J,B

我的输出应该如下

N, Mon, Tue, Wed, Mon, Tue, Wed, Mon, Tue, Wed
1, A, B, C, D, E, F , , ,
2, D, E, F, , , , B, E, J
3, I, J, K, D, E, F, I, J, B
5, , , , O, P, q, , , 
6, , , , , , , L, D, O
Client Name,Monday 08/18,Tuesday 08/19,Wednesday 08/20,Thursday 08/21,Friday 08/22,Saturday 08/23,Sunday 08/24,Monday 08/25
ns2.advancemags.com->/var,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns2.advancemags.com->/usr,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns2.advancemags.com->/,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns2.advancemags.com->/boot,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns3.advancemags.com->/boot,,Successful Full FS_UNIX_Tue_C Synthetic_Full 0B; ,,,,,,
ns3.advancemags.com->/,,Successful Full FS_UNIX_Tue_C Synthetic_Full 0B; ,,,,,,
ns3.advancemags.com->/usr,,Successful Full FS_UNIX_Tue_C Synthetic_Full 0B; ,,,,,,

答案1

在bash中,定义一个函数

function hsort { 
head -n +1 "$1" ; sort <(tail -n +2 "$1"); 
}

然后

join -a1 -a2 -t, -o0,1.2,1.3,1.4,1.5,1.6,1.7,2.2,2.3,2.4 \
<(join -a1 -a2 -t, -o0,1.2,1.3,1.4,2.2,2.3,2.4 <(hsort file1) <(hsort file2)) \
<(hsort file3) | sed 's/,/, /g'

给予

N, Mon, Tue, Wed, Mon, Tue, Wed, Mon, Tue, Wed
1, A, B, C, D, E, K, , , 
2, D, E, F, , , , B, E, J
3, I, J, X, D, E, F, I, J, B
5, , , , O, P, q, , , 
6, , , , , , , L, D, O

[注意:您的 file2D,E,K第 1 行中的内容D,E,F与所需输出中所示的不同。]


扩展到四个文件很简单

join -a1 -a2 -t, -o0,1.2,1.3,1.4,1.5,1.6,1.7,2.2,2.3,2.4,2.5,2.6,2.7 \
<(join -a1 -a2 -t, -o0,1.2,1.3,1.4,2.2,2.3,2.4 <(hsort file1) <(hsort file2)) \
<(join -a1 -a2 -t, -o0,1.2,1.3,1.4,2.2,2.3,2.4 <(hsort file3) <(hsort file4)) | 
sed 's/,/, /g'

处理更多的超过四个文件将需要额外的连接级别,并且很快就会开始看起来很难看 - 在这种情况下我不会推荐这种方法。

相关内容