【问题标题】:What is the best way to convert my input text to output in linux shell在 linux shell 中将输入文本转换为输出的最佳方法是什么
【发布时间】:2017-02-03 09:52:25
【问题描述】:

我正在尝试在 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

提前致谢!

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

【问题讨论】:

  • awk '!a[$0]++' file 之类的东西应该可以工作(您必须使用字段分隔符)。这个问题对于 bash 来说很常见,但我找不到确切的重复项
  • @Aserre:再看一遍,这看起来不像您发布的那个的副本。 OP 想要重新排序输入文件以显示输出。我假设,输出将重新格式化多行
  • @Inian 是的,我没有注意到 OP 输入中的时间戳并不完全相同。此外,如果消息 1 和消息 2 不是唯一的,则必须根据 Header/Trailer 块来处理日志消息。
  • @Abhishek Narayan:输入总是按照您输入的顺序排列,还是不需要?
  • @Inian 没错,消息行不是重复的,它有不同的时间戳。

标签: linux bash shell unix ksh


【解决方案1】:

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

uniq -f3 file

您很幸运,该命令仍然适用于您的用例,无需使用 awk 进行编程。我引用了手册页的某些部分:

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

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

【讨论】:

  • 非常感谢!你拯救了我的一天。它完美地工作。因为我是新来的,所以我无法支持这个答案。
【解决方案2】:

@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 的值设置为空并打印行。

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 2011-01-03
    • 2017-08-22
    • 1970-01-01
    • 2016-05-29
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多