Chinaunix

标题: 高难度shell问题 [打印本页]

作者: chinage    时间: 2006-01-12 19:03
标题: 高难度shell问题
请教大家一个高难度问题:
有一个文本a.txt,假设内容为:
2006
zhang
2005
wang
2003
zhang
2003
liu
2001
zhang


想达到以下结果
2006 zhang
2005
wang
2003 zhang
2003
liu
2001 zhang

即zhang开头的行和上一行合并

如何实现,试了半天的sed,awk,还没搞出来,郁闷咯
作者: waker    时间: 2006-01-12 19:39
sed -n 'H;${g;s/\nzhang/zhang/gp}' urfile

有空读了置顶文章再试吧

[ 本帖最后由 waker 于 2006-1-12 20:07 编辑 ]
作者: chinage    时间: 2006-01-12 20:23
:(
报错:
sed: Function H;${g;s/\nORA/ORA/gp} cannot be parsed.

我的是HPUX
作者: waker    时间: 2006-01-12 20:28
加-e
作者: chinage    时间: 2006-01-12 20:45
$sed -n -e 'H;${g;s/\nORA/ORA/gp}' a
sed: Function H;${g;s/\nORA/ORA/gp} cannot be parsed.
作者: chinage    时间: 2006-01-12 20:51
请教斑竹,'H;${g;是啥意思咯?
作者: chinage    时间: 2006-01-12 21:00
${......}
??是啥意思咯?
作者: r2007    时间: 2006-01-12 21:11
fyi: sed1line
  1. sed -e :a -e '$!N;s/\nzhang/ zhang/;ta' -e 'P;D'  
复制代码

作者: chinage    时间: 2006-01-12 21:15
楼上的太感谢了!!刚好达到效果,哈哈。高人!!
作者: chinage    时间: 2006-01-12 21:59
能否请r2007解释一下除替换之外的部分的含义啊?不胜感激!!
作者: zhl1979    时间: 2006-01-12 22:03
cat file|xargs -n2|awk '{if($2~/zhang/)print$1 "\t"  $2 } {if($2!~/zhang/)print$1 "\n"  $2 }'
作者: r2007    时间: 2006-01-12 23:00
原帖由 chinage 于 2006-1-12 21:59 发表
能否请r2007解释一下除替换之外的部分的含义啊?不胜感激!!

http://bbs.chinaunix.net/viewthr ... 3%26filter%3Ddigest
作者: biaog    时间: 2006-01-13 00:54
# sed 'N;s/\nzhang/ zhang/' test         
2006 zhang
2005
wang
2003 zhang
2003
liu
2001 zhang
作者: woodie    时间: 2006-01-13 10:02
原帖由 biaog 于 2006-1-13 00:54 发表
# sed 'N;s/\nzhang/ zhang/' test         
2006 zhang
2005
wang
2003 zhang
2003
liu
2001 zhang

如果zhang出现在奇数行会怎样?
不过r2007的代码中跳转命令似乎是可以省掉的:
  1. sed -ne '$!N;s/\nzhang/ zhang/g;P;D'
复制代码

作者: r2007    时间: 2006-01-13 10:16
原帖由 woodie 于 2006-1-13 10:02 发表

如果zhang出现在奇数行会怎样?
不过r2007的代码中跳转命令似乎是可以省掉的:
  1. sed -ne '$!N;s/\nzhang/ zhang/g;P;D'
复制代码


如果连续出现多行zhang,就无法省略了。
sed1line的例子考虑的比较周全,对于本例,看样子不会出现连续多行的以zhang开头的情况。
作者: woodie    时间: 2006-01-13 10:26
原帖由 r2007 于 2006-1-13 10:16 发表
如果连续出现多行zhang,就无法省略了。
sed1line的例子考虑的比较周全,对于本例,看样子不会出现连续多行的以zhang开头的情况。

说得对,那样zhang出现在奇数行的机会也不大了,biaog的代码也可以工作得很好。

7兄sed的功夫小弟实在难以忘其项背,PFPF!
by the way,awk方面我最佩服waker。向你们学习!
作者: chinage    时间: 2006-01-13 11:23
都是高手啊,佩服之至!!
作者: pvb1979    时间: 2006-01-13 14:14
最好能请waker和R7两人分别写awk和sed的深度介绍?因为尽管sed1line好,但是是一家之言,如果能百花齐放,才是shell群的福音。
希望waker和R7能不藏私,关于同一话题的多篇讨论必然会提高个人的能力。
作者: 231053469    时间: 2006-01-13 14:18
原帖由 pvb1979 于 2006-1-13 14:14 发表
最好能请waker和R7两人分别写awk和sed的深度介绍?因为尽管sed1line好,但是是一家之言,如果能百花齐放,才是shell群的福音。
希望waker和R7能不藏私,关于同一话题的多篇讨论必然会提高个人的能力。
好句点````
作者: cao_doctor    时间: 2011-12-02 09:29
sed 'N;s/\nzhang/\tzhang/' a.txt




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2