需要一个脚本或命令将前一行附加到以小写字母开头的当前行

需要一个脚本或命令将前一行附加到以小写字母开头的当前行

在 Excel 中打开文件之前我尝试格式化的输出如下所示:

1. |1.99934| BD | 1| C   1 - H   2
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|
f 0.00|  0.01%|
| 39.88%|   0.6315* H   2 s| 99.94%|p 0.00|  0.06%|
2. |1.99934| BD | 1| C   1 - H   3
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|
f 0.00|  0.01%|
| 39.88%|   0.6315* H   3 s| 99.94%|p 0.00|  0.06%|
3. |1.99934| BD | 1| C   1 - H   4
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|
f 0.00|  0.01%|
| 39.88%|   0.6315* H   4 s| 99.94%|p 0.00|  0.06%|
4. |1.99934| BD | 1| C   1 - H   5
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|
f 0.00|  0.01%|
| 39.88%|   0.6315* H   5 s| 99.94%|p 0.00|  0.06%|

我想要一种方法将以“f”开头的行添加到上一行,以便输出如下所示:

1. |1.99934| BD | 1| C   1 - H   2
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   2 s| 99.94%|p 0.00|  0.06%|
2. |1.99934| BD | 1| C   1 - H   3
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   3 s| 99.94%|p 0.00|  0.06%|
3. |1.99934| BD | 1| C   1 - H   4
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   4 s| 99.94%|p 0.00|  0.06%|
4. |1.99934| BD | 1| C   1 - H   5
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   5 s| 99.94%|p 0.00|  0.06%|

我尝试使用 SED 执行此操作的尝试没有成功!帮助!!

答案1

使用paste

$ paste -d '\n\0\n\n' - - - - <file
1. |1.99934| BD | 1| C   1 - H   2
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   2 s| 99.94%|p 0.00|  0.06%|
2. |1.99934| BD | 1| C   1 - H   3
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   3 s| 99.94%|p 0.00|  0.06%|
3. |1.99934| BD | 1| C   1 - H   4
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   4 s| 99.94%|p 0.00|  0.06%|
4. |1.99934| BD | 1| C   1 - H   5
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   5 s| 99.94%|p 0.00|  0.06%|

由于您似乎想从每组四行中删除第二个换行符,因此上面的paste命令就是这样做的。

答案2

Anawk表示组中任意数量的行并以任意小写字母开头 ....

awk -v ORS= '{print (($0!~"^[a-z]"&&NR>1)?"\n":"")$0}END{ print "\n"}' file

设置ORS为空并在不以小写字母开头时打印\n,记住不要放在$0第一行之前。$0\n

输出

1. |1.99934| BD | 1| C   1 - H   2
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   2 s| 99.94%|p 0.00|  0.06%|
2. |1.99934| BD | 1| C   1 - H   3
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   3 s| 99.94%|p 0.00|  0.06%|
3. |1.99934| BD | 1| C   1 - H   4
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   4 s| 99.94%|p 0.00|  0.06%|
4. |1.99934| BD | 1| C   1 - H   5
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   5 s| 99.94%|p 0.00|  0.06%|

笔记:sed如果您将搜索替换f为捕获组中的正则表达式\n([a-z])并重新插入捕获的字符\1,则基本上与注释中的 @steeldriver 响应相同。

我只是发现awk更具可读性。

答案3

在前:

printf '%s\n' g/^f/-1j wq | ex file

这使用lobal 命令在所有以 开头的行上g运行oin 。 Join 只是连接线。-1jf

答案4

$ awk '{printf "%s%s", (/^f/ ? "" : s), $0; s=ORS} END{print ""}' file
1. |1.99934| BD | 1| C   1 - H   2
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   2 s| 99.94%|p 0.00|  0.06%|
2. |1.99934| BD | 1| C   1 - H   3
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   3 s| 99.94%|p 0.00|  0.06%|
3. |1.99934| BD | 1| C   1 - H   4
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   4 s| 99.94%|p 0.00|  0.06%|
4. |1.99934| BD | 1| C   1 - H   5
| 60.12%|   0.7754* C   1 s| 24.99%|p 3.00| 74.95%|d 0.00|  0.05%|f 0.00|  0.01%|
| 39.88%|   0.6315* H   5 s| 99.94%|p 0.00|  0.06%|

相关内容