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

时间:2010-01-20 23:27:48

标签: linux shell 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实现这一点时遇到很多麻烦,似乎它可能不是我认为应该非常简单的最佳方式。

任何建议都非常感谢。

5 个答案:

答案 0 :(得分:18)

非常基本的sed实施:

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

这依赖于上的第一个字符'number'行是一个数字(如您所指定的那样)。

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

答案 1 :(得分:1)

这是我的Intranet上的文件。我不记得我在哪里找到了方便的sed单线。如果你搜索'sed one-liner'

,你可能会发现一些东西

你是否曾经需要结合文本行,但手动操作太繁琐了。

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

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

每个日期(2003年4月14日)是数据记录的开头,并在接下来的四行继续。

我们想将此输入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

我没有说这是显而易见的,还是简单的,是吗?

这是你在极少数情况下在某个地方写下来的命令。

答案 2 :(得分:1)

尝试使用正则表达式,例如:

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

检查第一行的数字(0-9)和逗号,然后将所有内容替换为新行,将其删除。

答案 3 :(得分:1)

另一个awk解决方案,比其他一些答案更不含神秘:

awk '/^[0-9]/ {n = $0; getline; print n $0; next} 1'

答案 4 :(得分:0)

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