结合使用sed或awk的匹配行?

我有一个如下的文件:

1, cake:01351 12, bun:1063 scone:13581 biscuit:1931 14, jelly:1385 

我需要将其转换,以便在行的开头读取一个数字时,它将与下面的行结合,但是如果在开始时没有数字,则行保持原样。 这将是我需要的输出:

 1,cake:01351 12,bun:1063 scone:13581 biscuit:1931 14,jelly:1385 

sed实现这个很麻烦,看起来可能不是我认为应该很简单的最好方法。

任何build议不胜感激。

一个非常基本的sed实现:

 sed -e '/^[0-9]/{N;s/\n//;}' 

这依赖于只有 “数字”行上的第一个字符是一个数字(如您所指定的)。

  • 匹配以数字开头的行, ^[0-9]
  • 带来下一行, N
  • 删除嵌入的换行符, s/\n//

这是我的内部网上的一个文件。 我不记得我在哪里找到了方便的sed单线程。 你可能会发现一些东西,如果你搜索“sed单行”


你有没有需要把文本的行结合起来,但是手工操作太乏味了。

例如,假设我们有一个数百行文本文件,如下所示:

 14/04/2003,10:27:47,0 IdVg,3.000,-1.000,0.050,0.006 GmMax,0.011,0.975,0.005 IdVg,3.000,-1.000,0.050,0.006 GmMax,0.011,0.975,0.005 14/04/2003,10:30:51,600 IdVg,3.000,-1.000,0.050,0.006 GmMax,0.011,0.975,0.005 IdVg,3.000,-1.000,0.050,0.006 GmMax,0.010,0.975,0.005 14/04/2003,10:34:02,600 IdVg,3.000,-1.000,0.050,0.006 GmMax,0.011,0.975,0.005 IdVg,3.000,-1.000,0.050,0.006 GmMax,0.010,0.975,0.005 

每个日期(14/04/2003)是数据记录的开始,并在接下来的四行继续。

我们想把这个输入到Excel中作为一个“逗号分隔值”文件,并查看它自己行中的每个记录。

在我们的例子中,我们需要将以G或I开始的任何行追加到前一行,并插入一个逗号,以便产生以下内容:

 14/04/2003,10:27:47,0,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.005,IdVg,3.000,... 14/04/2003,10:30:51,600,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.0005,IdVg,3.000,... 14/04/2003,10:34:02,600,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.0005,IdVg,3.000,... 

这是“正则表达式”的经典应用,再一次,sed来拯救。

编辑可以用一个sed命令完成:

 sed -e :a -e '$!N;s/\n\([GI]\)/,\1/;ta' -e 'P;D' filename >newfilename 

我没有说这是明显的还是容易的,我呢?

这是你在需要的时候在罕见场合写下的那种命令。

尝试正则表达式,例如:

 sed '/[0-9]\+,/{N}s/\n//)' 

检查第一行的数字(0-9)和逗号,然后用空白替换新行,删除它。

另一个awk解决方案,比其他一些答案更隐蔽:

 awk '/^[0-9]/ {n = $0; getline; print n $0; next} 1' 
 $ awk 'ORS= /^[0-9]+,$/?" ":"\n"' file 1, cake:01351 12, bun:1063 scone:13581 biscuit:1931 14, jelly:1385