我有一个带有虚线的文件,如下所示,
C12321 net12415431 net41432143 +
1.079879E-17
C12322 net2135 net648641 +
3.4659E-17
我想从这个文件创建一个文件,其中包含如下行
C12321 net12415431 net41432143 1.079879E-17
C12322 net2135 net648641 3.4659E-17
我需要在几行中使用 sed 或 awk 来执行此操作。
问候,阿西夫
sed 是用于在单行上进行简单替换的出色工具,但对于任何其他文本操作,只需使用 awk - 解决方案将更清晰、更易于扩展、更健壮、更便携,并且在许多情况下更简洁(没那么重要) .
读取文件并删除所有出现的“+\n”(空格加换行符):
$ cat file
C12321 net12415431 net41432143 +
1.079879E-17
C12322 net2135 net648641 +
3.4659E-17
$ awk -v RS= '{gsub(/ \+\n/,""); print}' file
C12321 net12415431 net41432143 1.079879E-17
C12322 net2135 net648641 3.4659E-17
有很多选择,一些更简短,一些使用更少的内存,等等。这只是最清楚的恕我直言。
单个sed命令的更长但更易读的替代方案:
tr '+' '\\' < tmp.txt | while read line; do printf "%s\n" "$line"; done
这只是用+shell 内置read理解的行继续字符替换。
你可以这样做:
$ sed ':a;N;$!ba;s/+\n/ /g' your_file
它将+用空字符串替换所有后跟的新行。
如果您希望使用此替换更新文件,请添加-i参数:
$ sed -i ':a;N;$!ba;s/+\n/ /g' your_file
该命令的解释可以在https://stackoverflow.com/a/1252191/1983854中找到:
更新:解释。
- 通过创建标签
:a- 通过将当前行和下一行附加到模式空间
N- 如果我们在最后一行之前,则分支到创建的标签
$!ba($!意味着不在最后一行执行(因为应该有一个最后的换行符))。- 最后,替换用模式空间(即整个文件)上的空格替换每个换行符。
这可能对您有用(GNU sed):
sed '$!N;s/ +\n//;P;D' file