在linux shell中将输入文本转换为输出的最佳方法是什么?

时间:2017-02-03 09:52:26

标签: linux bash shell unix ksh

我正在尝试在linux下面的文本文件格式化。你能不能建议什么是实现我的输出的最佳方法。

输入文字

Header| Header Identifier
[2017-02-03 14:23:44,066] - Message 1
[2017-02-03 14:23:45,066] - Message 1
[2017-02-03 14:23:46,066] - Message 1
[2017-02-03 14:23:47,066] - Message 1
Trailer | Trailer Identifer
Header| Header Identifier
[2017-02-03 14:23:44,066] - Message 2
[2017-02-03 14:23:45,066] - Message 2
[2017-02-03 14:23:46,066] - Message 2
[2017-02-03 14:23:47,066] - Message 2
Trailer | Trailer Identifer

输出我正在尝试生成

Header| Header Identifier
[2017-02-03 14:23:44,066] - Message 1
Trailer | Trailer Identifer
Header| Header Identifier
[2017-02-03 14:23:44,066] - Message 2
Trailer | Trailer Identifer

提前致谢!

更新:我不是要在这里删除重复项,我想保留最低时间戳记录并删除其他记录。

2 个答案:

答案 0 :(得分:2)

有一个bash命令:uniq。输入该命令:

uniq -f3 file

你很幸运,命令仍然适用于你的用例,没有必要用awk编程。我引用了手册页的某些部分:

uniq过滤来自INPUT(或标准输入)的相邻匹配行,写入OUTPUT(或标准输出)。

选项-f3避免比较前3个字段。

答案 1 :(得分:0)

@Abhishek Narayan:试试:

awk --re-interval '/[0-9]{4}-[0-9]{2}-[0-9]{2}/ && !Q{print;Q=1;next} !/[0-9]{4}-[0-9]{2}-[0-9]{2}/{Q="";print}'  Input_file

考虑到您的Input_file已按日期排序。我正在检查正则表达式的日期,然后检查名为Q的值的变量是否为空,打印行并将Q的值设置为1.因此当行与日期模式不匹配时,它将变量Q的值设置为null并打印这条线。

相关问题