前几天在CSDN上看到一个帖子http://bbs.csdn.net/topics/390848841,楼主贴了下面的问题:

  1. 例:
  2. 12345
  3. 67890
  4. 1234567890
  5. 123
  6. 4567890
  7. 如何能把上面数据转换成
  8. 1234567890
  9. 1234567890
  10. 1234567890
    看了几位网友的回复,觉得还是挺有意思,也收获了一些知识,因为部分网友只给出了解决方法,没有解释下,我根据自己的理解,对几个答案解释下(不一定准确,错误之处请指正)
我认为错的答案
1    首先楼主给出了一个他说调试不出来的答案:
  1. sed 's/(?!90)\n//g'
?!应该是非pattern结尾的意思,这个答案应该是说把非90结尾的行的换行符换位空。
这个答案应该是不可行的。sed默认单行模式,一次处理一行,运行时发现,就算我们把换行符去掉了,sed命令结束后,还是将它当成完整的一行输出(也就是说,应该是自动又加上换行符了)
2.    有一位网友,觉得其他答案太复杂,给出了下面的方法
sed ‘N;s/\n//g’

        这个答案使用了sed的多行模式,但应该是无法实现楼主的目的的。我们看运行结果“
windeal@ubuntu:~/Windeal/shell$ sed 'N;s/\n//g' a.txt
1234567890
1234567890123
4567890

可以看出,sed 的N命令把第二行接到第一行后面,把第四行接到第三行后面,没有考虑到我们目标中:只有非90结尾的才把下一行附加上来。所以第四行的123被附加到第三行1234567890而出现了错误的结果。

我认为对的答案
再来看两个我认为对的答案:
1.
sed -e '/^/{:loop /90$/!{N;b loop};s/\n//g}' test.txt > t2.txt
改一下好理解一点就是
sed '{:myloop /90$/!{N;b myloop};s/\n//g}' a.txt

/^/的意思我没弄明白,应该是匹配每一行吧
      在该命令中,myloop是一个自定义的标签。类似程序语言中goto用的标签。 N表示多行模式,b表示分支(相当于goto)
这样就好理解了,sed会读取一行内容,如果这一行不是以90结尾,/90$/! 就为真,进入{N;b myloop}。N就进入了多行模式,把下一行附加上来,然后进入分支b
myloop,在判断是不是以90结尾,这样反复读取,直到读到以90结尾的行。接下来模式空间的读取工作已经完成,进入下一个命令,替换,s/\n//g​这个命令把当前模式空间的换行符都转换为空,也就是拼接成一行。
    如此,我们就完成了我们要的目的。

2. 
awk '{if($0~/90$/){print}else{printf("%s",$0)}}' a.txt 
这个答案读取了一行的所以字段(实际上就1个字段,) 用$0表示,然后if($0~/90$/)判断是不是以90结尾。
如果以90结尾,就输出当前行数据。
如果不是,就格式化输入当前航的字符串
注意print和printf的区别




awk与sed:一个关于多行处理的例子的更多相关文章

  1. awk与sed:关于多行的样本

    几天前CSDN看到一个帖子http://bbs.csdn.net/topics/390848841,楼主贴了以下的问题: 例: 12345 67890 1234567890 123 4567890 怎 ...

  2. Oracle学习笔记:一个简单的行转列例子

    一个简单的行列转换例子,原始数据. create table temp_cwh_student ( name ), subject ), score ) ) select * from temp_cw ...

  3. 使用awk和sed获取文件奇偶数行的方法总结

    测试文件test.file [root@localhost ~]# cat test.file 111111111111111 222222222222222 333333333333333 4444 ...

  4. sed 删除最后几行 和删除指定行 awk使用

    sed 删除最后几行 和删除指定行   转载原文链接:http://blog.51cto.com/lspgyy/1305489 sed 想删除文件中的指定行,是可以用行号指定也可以用RE来匹配的. 删 ...

  5. Linux字符串截取和处理命令 cut、printf、awk、sed、sort、wc

    1. cut [选项] 文件名 -f  列号 #提取第几列(分隔符默认为\t) -d  分隔符 #指定分隔符 例如:cut -f 2 a.txt #截取文件a.txt内容的第二列(列号从1开始) cu ...

  6. 正则表达式、find、grep、awk、sed

    1.正则表达式    (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成.   (2)基本元字符集及其含义       ^ :只 ...

  7. awk、sed、date命令使用

    个人学习笔记总结 [root@a ~]# awk 'END{print NR}' c.txt       #没错,这就是文件的行数,当然,这种统计方法不是linux下最快的,但也是一种思路3[root ...

  8. Linux中一个文件10行内容,如何输出5-8内容到屏幕

    题目是这样的,Linux中一个文件10行内容,如何输出5-8内容到屏幕首先我们模拟一下这样的环境: [root@localhost question]# pwd /root/question [roo ...

  9. linux中cut、printf、awk、sed命令

    cut.printf.awk.sed在linux中都是用来处理文本的命令,接下来一个一个看. 一.cut命令 cut [选项] 文件名 选项: 主要使用一下两个参数,若是只使用 -f 则默认的分割符为 ...

随机推荐

  1. docker基本用法和命令

    1.安装docker 检查有没有curl which curl 如果没有用以下命令可安装:sudo apt-get install curl 通过官方提供的脚本安装最新docker curl -sSL ...

  2. debug教程

    名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump) 内存16进制显示 d [addre ...

  3. igraph Tutorial

      igraph Tutorial¶   参考http://www.cs.rhul.ac.uk/home/tamas/development/igraph/tutorial/tutorial.html ...

  4. JavaScript常用工具方法封装

    因为工作中经常用到这些方法,所有便把这些方法进行了总结. JavaScript 1. type 类型判断 isString (o) { //是否字符串 return Object.prototype. ...

  5. IT最新最火的网络词汇*2*(文章来源电商)

          P2P.P2C .O2O .B2C.B2B.C2C等等最新最火的网络用词直接将我们都弄晕了,特此今天将这些划时代意义的词汇总结起来,若有什么不足之处,希望各位评论指正. 大致意思为: 1. ...

  6. mysql增加远程访问

    grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

  7. kafka运行错误:提示找不到或者无法加载主类错误解决方法

    kafaka版本:kafka_2.11-1.1.0原因有2个:1  目录不能有空格   D:\Soft\kafka_2.11-1.1.0 , 放在Program Files目录中一直有问题2  修改D ...

  8. Activiti工作流与spring集成

    一.前言 前面Activiti工作流的学习,说明了Activiti的基本应用,在我们开发中可以根据实际的业务参考Activiti的API去更好的理解以及巩固.我们实际的开发中我们基本上都使用sprin ...

  9. RabbitMQ延迟队列

    rabbitmq延迟队列 rabbitmq实现延迟队列用了rabbitmq-delayed-message-exchange插件,需要提前安装,并启用. 原理 其原理是通过Exchange来实现延迟功 ...

  10. bellman-ford(可判负权回路+记录路径)

    #include<iostream> #include<cstdio> using namespace std; #define MAX 0x3f3f3f3f #define ...