bash - 在每个时间 block 之间添加空行

标签 bash awk sed

我有一个输入日志表单:

system 2018-02-05 04:15:49 :: aaaaaaaaaaaaa  
system 2018-02-05 04:15:51 :: aaaaaaaaaaaaa  
system 2018-02-05 04:15:51 :: aaaaaaaaaaaaa  
system 2018-02-05 04:15:52 :: aaaaaaaaaaaaa  
system 2018-02-05 04:15:53 :: aaaaaaaaaaaaa  
system 2018-02-05 04:20:06 :: ccccccccccccc
system 2018-02-05 04:21:10 :: bbbbbbbbbbbbb
system 2018-02-05 04:21:10 :: ccccccccccccc
system 2018-02-05 04:21:10 :: ccccccccccccc
system 2018-02-05 04:21:10 :: ccccccccccccc
system 2018-02-05 04:23:49 :: bbbbbbbbbbbbb
system 2018-02-05 04:23:49 :: ccccccccccccc

并希望用空行分隔每个时间 block 。 上述输入的预期输出为:

system 2018-02-05 04:15:49 :: aaaaaaaaaaaaa

system 2018-02-05 04:15:51 :: aaaaaaaaaaaaa  
system 2018-02-05 04:15:51 :: aaaaaaaaaaaaa  

system 2018-02-05 04:15:52 :: aaaaaaaaaaaaa  

system 2018-02-05 04:15:53 :: aaaaaaaaaaaaa  

system 2018-02-05 04:20:06 :: ccccccccccccc

system 2018-02-05 04:21:10 :: bbbbbbbbbbbbb
system 2018-02-05 04:21:10 :: ccccccccccccc
system 2018-02-05 04:21:10 :: ccccccccccccc
system 2018-02-05 04:21:10 :: ccccccccccccc

system 2018-02-05 04:23:49 :: bbbbbbbbbbbbb
system 2018-02-05 04:23:49 :: ccccccccccccc

最佳答案

想法是形成每一行都是唯一的键,在你的例子中它是 $2$3 (即在 Awk 的上下文中,第二个和第三个空格分隔的列)。

我们通过这个组合构建一个唯一的键($2 $3),如果这个组合与后续行不同,我们在解析行时打印一个新行字符(也由特殊变量 ORS 或仅由 print "" 表示)在 Awk 中)。下面的代码反射(reflect)了这一点

$ awk '($2 $3)!=p && NR>1 {print ""} {print; p=($2 $3)}' file
system 2018-02-05 04:15:49 :: aaaaaaaaaaaaa  

system 2018-02-05 04:15:51 :: aaaaaaaaaaaaa  
system 2018-02-05 04:15:51 :: aaaaaaaaaaaaa  

...

关于bash - 在每个时间 block 之间添加空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48617875/

相关文章:

linux - 如何仅从文本文件的第一行和最后一行中提取数据

sed - 带有多个表达式的 sed 与带有分号的一个表达式相同吗?

sed 将模式移动到行首

linux - 来自 shell 脚本内部的 nohup 命令阻止脚本执行

regex - 使用egrep正则表达式捕获部分行

shell - 使用 awk 或 sed 获取两个模式之间的第 n 次出现

awk - 如何从tsv文件中提取第一列?

linux - 为什么在 find 命令中使用 dirname 会为每个匹配项提供点?

android - 将参数从 Linux 脚本传递到 Android

python - 我如何报告在整个脚本中从未匹配的任何正则表达式?