0

我有一个带有虚线的文件,如下所示,

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 来执行此操作。

问候,阿西夫

4

4 回答 4

1

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

有很多选择,一些更简短,一些使用更少的内存,等等。这只是最清楚的恕我直言。

于 2013-05-10T22:25:01.187 回答
0

单个sed命令的更长但更易读的替代方案:

tr '+' '\\' < tmp.txt | while read line; do printf "%s\n" "$line"; done

这只是用+shell 内置read理解的行继续字符替换。

于 2013-05-10T14:03:57.187 回答
0

你可以这样做:

$ 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中找到:

更新:解释。

  1. 通过创建标签:a
  2. 通过将当前行和下一行附加到模式空间N
  3. 如果我们在最后一行之前,则分支到创建的标签$!ba$!意味着不在最后一行执行(因为应该有一个最后的换行符))。
  4. 最后,替换用模式空间(即整个文件)上的空格替换每个换行符。
于 2013-05-10T13:37:27.647 回答
0

这可能对您有用(GNU sed):

sed '$!N;s/ +\n//;P;D' file
于 2013-05-10T22:05:32.753 回答