通过在数据行前面加上标题行来重新排列文本文件

use*_*305 4 grep sed awk text-processing

我有一个文件,其内容如下所示:

2009 150  0  0  0     0000
75.316   0.0400390625  0.00007        0.00000 0.8980
76.216   0.0400390625  0.00007        1.00000 0.9046
77.217   0.0400390625  0.00009        2.00000 0.9113
78.341   0.0400390625  0.00010        3.00000 0.9183
2009 150  2  0  0     0000
75.316   0.0400390625  0.00007        0.00000 0.8980
76.216   0.0400390625  0.00007        1.00000 0.9046
77.217   0.0400390625  0.00009        2.00000 0.9113
78.341   0.0400390625  0.00010        3.00000 0.9183
79.616   0.0400390625  0.00013        4.00000 0.9255
Run Code Online (Sandbox Code Playgroud)

我想要:

  1. 查找所有以关键字 2009 开头的行。
  2. 将这些行添加到所有后续行之前,直到找到以 2009 开头的另一行,依此类推,直到 EOF。

本质上,我正在寻找这样的输出:

2009 150  0  0  0     0000 75.316   0.0400390625  0.00007        0.00000 0.8980
2009 150  0  0  0     0000 76.216   0.0400390625  0.00007        1.00000 0.9046
2009 150  0  0  0     0000 77.217   0.0400390625  0.00009        2.00000 0.9113
2009 150  0  0  0     0000 78.341   0.0400390625  0.00010        3.00000 0.9183
2009 150  2  0  0     0000 75.316   0.0400390625  0.00007        0.00000 0.8980
2009 150  2  0  0     0000 76.216   0.0400390625  0.00007        1.00000 0.9046
Run Code Online (Sandbox Code Playgroud)

......

我已经在这个问题上摸索了很长一段时间,无法提出解决方案。帮助将不胜感激。我知道如何使用标志提取关键字之间的文本,但我不确定这是否是正确的方向。

Jos*_*lly 5

您可以awk为此使用:

awk '/^2009/{a=$0;next}{print a" "$0} ' file.txt
Run Code Online (Sandbox Code Playgroud)

这只会在 2009 年第一场比赛之前的任何行前添加一个空格,您可以设置一个默认字符串以这样添加:

awk 'BEGIN{a="My default prepend string";}/^2009/{a=$0;next}{print a" "$0} ' file.txt
Run Code Online (Sandbox Code Playgroud)