在文件中连接截断的行

时间:2013-05-10 13:34:46

标签: shell sed awk line

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

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 个答案:

答案 0 :(得分: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

有许多替代品,一些更简洁,一些使用更少的内存,等等。这只是最清晰的恕我直言。

答案 1 :(得分: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. 创建标签   
  3. 通过N
  4. 将当前和下一行附加到模式空间   
  5. 如果我们在最后一行之前,分支到创建的标签$!ba$!表示不在最后一行执行此操作(因为应该有一个)   最后换行))。
  6.   
  7. 最后,替换用模式空间(即整个文件)上的空格替换每个换行符。
  8.   

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed '$!N;s/ +\n//;P;D' file