【问题标题】:compare and merge output of different files with conditions比较和合并不同文件的输出与条件
【发布时间】:2017-12-04 07:00:39
【问题描述】:

我有以下三个文件:

文件1.txt

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

文件2.txt

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

文件3.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)。 我尝试使用“paste -d”命令合并上述文件。

【问题讨论】:

  • 欢迎来到堆栈溢出,好东西:您向我们展示了您使用了paste 命令并且您使用了代码标签作为示例。您能否也让我们知道获得输出的逻辑?因为不清楚。

标签: shell awk sed paste


【解决方案1】:

试试:

$ 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 需要文件作为参数。我们有命令。构造&lt;(...)paste -d, File2.txt File3.txt 等命令的输出转换为paste 可以使用的类文件对象。 &lt;(...) 被称为进程替换

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

$ 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 

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

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2021-01-16
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多