Chinaunix

标题: shell按条件合并行方法。 [打印本页]

作者: spouter    时间: 2012-03-05 10:00
标题: shell按条件合并行方法。
本帖最后由 spouter 于 2012-03-05 10:00 编辑

例子:
9360338 Q  A
9360312 Q  B
                  1
                  2
93603we Q  C
9312338 Q  D
                  1
                  2
93sddd3 Q E

希望结果,有什么好方法高手介绍下:
9360338 Q  A
9360312 Q  B 1 2
93603we Q  C
9312338 Q  D 1 2
93sddd3 Q  E
作者: spouter    时间: 2012-03-05 11:25
如果用正则能分段匹配吗?
例如:匹配上这一段
9360312 Q  B
                  1
                  2
作者: mpstat    时间: 2012-03-05 11:54
  1. sed -r '/^\S/{:a;N;s/\n\s+(\S+)$/ \1/;ta;P;D;}'
复制代码
awk的应该更好写一些
作者: spouter    时间: 2012-03-05 12:00
mpstat 发表于 2012-03-05 11:54
awk的应该更好写一些


实现没问题,不是太明白sed写法的思路,能给指点下吗?
作者: spouter    时间: 2012-03-05 12:03
sed -r '/^\S/{:a;N;s/\n\s+(\S+)$/ \1/;ta;D;}'


中间的:a;N;什么意思?
结尾的ta;D;也没明白?
作者: yangkyo821    时间: 2012-03-05 12:08
本帖最后由 yangkyo821 于 2012-03-05 12:10 编辑
  1. awk '/^\w/{if(NR!=1)print a;a=$0;next}{a=a FS $1}END{print a}' file
复制代码

作者: mpstat    时间: 2012-03-05 12:28
回复 5# spouter


    看楼下的awk应该更容易懂一些
作者: yinyuemi    时间: 2012-03-05 12:44
回复 1# spouter


    awk '{printf (NF==1?FS:RS) $0}'

作者: spouter    时间: 2012-03-05 13:16
本帖最后由 spouter 于 2012-03-05 10:00 编辑

还是没太明白,能给大概说说不,还有如果每行有多段数值(空格分隔),怎么套用.

例子:
9360338 Q  A t1 t2
9360312 Q  B  t1 t2
                   1  t1 t2
                   2   t1 t2
93603we Q  C  t1 t2

结果:
9360338 Q  A t1 t2
9360312 Q  B  t1 t2 1  t1 t2 2   t1 t2
93603we Q  C  t1 t2

作者: yinyuemi    时间: 2012-03-05 13:37
回复 9# spouter


    awk '{printf (/^[[:blank:]]/?FS:RS) $0}'
作者: zhaopingzi    时间: 2012-03-05 14:02
回复 9# spouter


    套用6楼的
awk '/^\w/{print a;a=$0;next}{a=a FS $1 FS $2 FS $3}END{print a}'
作者: yangkyo821    时间: 2012-03-05 14:20
套用下10楼的
  1. awk '{printf /^\w/?RS $0 : FS gensub(/^\W+/,"",$0)}' file
复制代码

作者: zhaopingzi    时间: 2012-03-05 14:44
yangkyo821 发表于 2012-03-05 12:08


这段如下执行的呢。请您把我的伪码补充一下,我走不下去了
:head
if 匹配 /^\w/
    if(NR!=1)
    print a;a=$0;读入下一行
    goto head
fi
。。。。。
作者: yangkyo821    时间: 2012-03-05 15:34
本帖最后由 yangkyo821 于 2012-03-05 15:36 编辑

--
作者: yangkyo821    时间: 2012-03-05 15:37
本帖最后由 yangkyo821 于 2012-03-05 15:37 编辑
zhaopingzi 发表于 2012-03-05 14:44
这段如下执行的呢。请您把我的伪码补充一下,我走不下去了
:head
if 匹配 /^\w/

这样?
/^\w/{
    if(NR!=1)
        print a
    a=$0
    next
}
作者: zooyo    时间: 2012-03-05 22:10
提示: 作者被禁止或删除 内容自动屏蔽




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