在 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 只是连接线。-1j
f
答案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%|