比较和合并不同文件的输出与条件

时间:2017-12-04 07:00:40

标签: shell awk sed paste

我有三个文件如下:

FILE1.TXT

Add,abc,5
Add,xyz,10
Del,test,14  

FILE2.TXT

abc,123,567
abc,123,568
xyz,234,879
xyz,234,880
test,435,227
test,435,228

File3.txt

23
28
30
40
50
36

最终所需的输出应如下所示:

abc,123,567,23
abc,123,568,28,Add,abc,5
xyz,234,879,30
xyz,234,880,40,Add,xyz,10
test,435,227,50
test,435,228,36,Del,test,14 

最终输出应该在比较时合并(abc,xyz,test)。 我尝试使用"粘贴-d"来合并上面的文件。命令。

1 个答案:

答案 0 :(得分:0)

尝试:

$ paste -d "" <(paste -d, File2.txt File3.txt) <(sed 's/^/\n,/' File1.txt )
abc,123,567,23
abc,123,568,28,Add,abc,5
xyz,234,879,30
xyz,234,880,40,Add,xyz,10
test,435,227,50
test,435,228,36,Del,test,14 

如何运作

第一步是你需要将File2.txt与File3.txt结合使用:

$ paste -d, File2.txt File3.txt
abc,123,567,23
abc,123,568,28
xyz,234,879,30
xyz,234,880,40
test,435,227,50
test,435,228,36

其次,我们需要像这样填充空间File1.txt:

$ sed 's/^/\n,/' File1.txt

,Add,abc,5

,Add,xyz,10

,Del,test,14 

最后,我们需要将上述两者与另一个粘贴命令结合使用:

$ paste -d "" <(paste -d, File2.txt File3.txt) <(sed 's/^/\n,/' File1.txt)
abc,123,567,23
abc,123,568,28,Add,abc,5
xyz,234,879,30
xyz,234,880,40,Add,xyz,10
test,435,227,50
test,435,228,36,Del,test,14 

paste期望参数文件。我们有命令。构造<(...)paste -d, File2.txt File3.txt之类的命令输出转换为paste可以使用的类文件对象。 <(...)称为流程替换

我们可以使用临时文件做同样的事情:

$ paste -d, File2.txt File3.txt >tmp1; sed 's/^/\n,/' File1.txt >tmp2; paste -d "" tmp1 tmp2
abc,123,567,23
abc,123,568,28,Add,abc,5
xyz,234,879,30
xyz,234,880,40,Add,xyz,10
test,435,227,50
test,435,228,36,Del,test,14 

进程替换消除了对临时文件的需求。