Chinaunix

标题: 上下行合并的问题 [打印本页]

作者: lnzfm    时间: 2015-03-16 15:45
标题: 上下行合并的问题
1:id=123
id=123
2:id=111
id=111
3:id=123
id=234
id=456

请教这个怎么弄成
1:id=123 id=123
2:id=111 id=111
3:id=123 id=234 id=456
作者: 我是一隻羊    时间: 2015-03-16 15:54
本帖最后由 我是一隻羊 于 2015-03-16 16:10 编辑
  1. sed -r  '{:a;N;$!ba;s/\n(id)/ \1/g}' inputfile
复制代码
  1. awk '/:/{a[++i]=$0;next}{a[i]=a[i]" "$0}END{for(i=0;i++<length(a);)print a[i]}' inputfile
复制代码

作者: zhxjfl    时间: 2015-03-16 16:03
本帖最后由 zhxjfl 于 2015-03-16 16:52 编辑

delete.............
作者: lnzfm    时间: 2015-03-16 16:16
多谢,写的很漂亮,学习了
作者: bulletmarquis    时间: 2015-03-16 16:23
回复 3# zhxjfl


    目测最后三行会有问题
作者: bulletmarquis    时间: 2015-03-16 16:25
回复 1# lnzfm
  1. awk '/^[0-9]/{printf "\n"$0;next}{printf " "$0}END{print ""}'
复制代码

作者: zxy877298415    时间: 2015-03-16 16:25
  1. awk -v RS='[0-9]+:'  'NR>1{printf p;for(i=1;i<=NF;i++) printf $i" ";print ""}{p=RT}' file
  2. 1:id=123 id=123
  3. 2:id=111 id=111
  4. 3:id=123 id=234 id=456
复制代码
回复 1# lnzfm


   
作者: liion631818    时间: 2015-03-16 17:29
  1. px@ubuntu:~/bash-script$ awk -vRS="[0-9]+:" -vOFS=" " '{NF+=0;if($0!="")print ORT, $0; ORT=RT}' testfile
  2. 1: id=123 id=123
  3. 2: id=111 id=111
  4. 3: id=123 id=234 id=456
复制代码

作者: ly5066113    时间: 2015-03-16 17:33
  1. sed ':a;N;/\ni/s/\n/ /;ta;P;D' file
复制代码

作者: reyleon    时间: 2015-03-16 18:11
  1. sed -r ':1;N;/\n[0-9]/!s/\n/ /;t1;P;D' file
复制代码

作者: wz64050010    时间: 2015-03-16 19:31
回复 2# 我是一隻羊


    大神麻烦问一下。
这样写for(i=0;i++<length(a)和for(i=0;i<length(a);i++)有啥区别?我把最前面++i改成i++修改了一下,会无限的刷空行,出一个空行我能理解。。出一片空行有点不能理解了
作者: 我是一隻羊    时间: 2015-03-16 22:10
本帖最后由 我是一隻羊 于 2015-03-16 22:19 编辑

回复 11# wz64050010
  1. for(i=0;i++<length(a);)
复制代码
先判断i是不是小于length(a),无论判断结果如何,执行i++,然后执行循环体.
以上面的循环头为例,在循环体中,i从1遍历到length(a)
  1. for(i=0;i<length(a);i++)
复制代码
先判断i是不是小于length(a),结果为真,执行循环体,循环体结束i++.
以上面的循环头为例,在循环体中,i从0遍历到length(a)-1


a[++i]和a[i++]的区别
a[++i]数组下标从1开始,a[i++]数组下标从0开始.

至于为什么不停输出空行,是这样的..
只输出一行的话你应该明白了吧.
前面的时候用i++,数组下标从0开始
后面用i++<length(a),输出数组从1遍历,最后差了一个.
比如原来数组只有10个元素,按你那样改完,在你认为的最后一次循环体会执行print a[10],注意这时候你就已经让a[10]存在了,它的值为空...所以length(a)的值就变了,直接+1,再进入下次循环判断循环不会结束,因为i++,length(a)也++了,于是就死循环不停输出空行.

作者: tuyajie    时间: 2015-03-16 23:22
求解!跪求回复 9# ly5066113


   
作者: wz64050010    时间: 2015-03-17 11:08
回复 12# 我是一隻羊


    明白了,感谢
作者: moperyblue    时间: 2016-12-07 19:55

  1. awk '{NF=NF;printf $0 RT}' RS='\n[0-9]+:'
复制代码

作者: cd_ly    时间: 2016-12-12 11:26
awk '/:/&&a{print a;a=""}{if(a){a=a" "$0}else{a=$0}}END{print a}' file
作者: sunzhiguolu    时间: 2016-12-15 08:44
  1. perl -0pe 's/\n(?!\d)/ /g' f
复制代码





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