将2个文件合并并重新格式化为新文件

时间:2019-06-20 09:17:15

标签: linux shell

我正在收集命令的一些输出,并希望将2个输出文件合并为一个新文件。

输出样本

output1.txt
OBJECTNAME(TEST.OBJ.1) TYPE(LOCAL)
MESSAGE(20)
OBJECTNAME(TEST.OBJ.2) TYPE(LOCAL)
MESSAGE(30)
...

output2.txt
OBJECTNAME(TEST.OBJ.1) TYPE(MESSAGE)
TIME(16.00.00) DATE(2018-01-11)
OBJECTNAME(TEST.OBJ.2) TYPE(MESSAGE)
TIME(23.44.56) DATE(2019-06-11)
...

我的代码是

MESSAGE=$(echo "DIS MESSAGE(*) MESSAGE")
MESSAGEINFO=$(echo "DIS MESSAGEINFO(*) TIME DATE")
echo "$MESSAGE" >> output1.txt
echo "$MESSAGEINFO" >> output2.txt 

我该怎么做才能使其像这样输出到output3.txt:

OBJECTNAME(TEST.OBJ.1) TYPE(LOCAL)
MESSAGE(20)
TIME(16.00.00) DATE(2018-01-11)
OBJECTNAME(TEST.OBJ.2) TYPE(LOCAL)
MESSAGE(30)
TIME(23.44.56) DATE(2019-06-11)

1 个答案:

答案 0 :(得分:0)

如果您不介意完全松开“ TYPE(MESSAGE)”和“ TYPE(MESSAGE)”,那么这可能是一个起点:

 diff -u2  <(sed 's/TYPE(LOCAL)//' output1.txt)  <(sed 's/TYPE(MESSAGE)//' output2.txt) | tr -d '+-' | sed -r '/^\s*$/d'
  • <(sed ...)从文件中删除TYPE(...)以提供一个同步点
  • diff显示文件之间的差异(使用OBJECTNAME(TEST.OBJ.XY)进行同步 这会输出一些带有+/-的信号来表示差异
  • tr从文件中删除所有+和-字符。 (如果您有意将它们放置在某处,则最好使用“ s / ^ + //”和“ s / ^-//”的sed,但在sed方面我并不那么好)
  • 激光sed删除空行

具有较高输入文件的输出:

 OBJECTNAME(TEST.OBJ.1)
MESSAGE(20)
TIME(16.00.00) DATE(20180111)
 OBJECTNAME(TEST.OBJ.2)
MESSAGE(30)
TIME(23.44.56) DATE(20190611)

进一步的清理工作可能是从sed's / ^ //'开始删除空间,但是我不想堆叠另一个管道。 当然,可能会有更好看的方式,但这可能就足够了。如果愿意,甚至可以在合并后重新添加TYPE(LOCAL)。

备注:仅当文件内容的结构/顺序与示例中的内容一样浅时,这才起作用...

相关问题