2010-01-20 79 views
3

我有这样一个文件中的以下内容:结合使用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实现这一目标,现在看来,这未必是什么,我觉得应该是很简单的最佳方式。

任何建议非常感谢。

回答

18

一个非常基本的sed实现:

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

这依赖于第一个字符上的“数量”行是一个号(指定)。

  • 开始与一些比赛线路,^[0-9]
  • 带来的下一行,N
  • 删除嵌入的换行符,s/\n//
+1

投了一个不错的解释。 – Anders 2010-01-20 23:46:19

1

这是一个文件我内联网。我不记得我在哪里找到了方便的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 

我没有说这将是明显的,否则容易,不是吗?

这是您在需要时偶尔记录的地方。

1

尝试正则表达式,如:

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

,用于检查一个数字(0-9)和一个逗号的第一行,并将其替换为任何新的线,将其移除。

+0

只检查一位数字。你需要'[0-9] \ +' – 2010-01-21 00:55:23

+0

啊,没有明白。固定。 – pagboy 2010-01-21 02:15:18

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

另一个AWK的解决方案,比一些其他的答案不太神秘:

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