zoukankan      html  css  js  c++  java
  • awk与sed:一个关于多行处理的例子

      前几天在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) //g'
    ?!应该是非pattern结尾的意思,这个答案应该是说把非90结尾的行的换行符换位空。
    这个答案应该是不可行的。sed默认单行模式,一次处理一行,运行时发现,就算我们把换行符去掉了,sed命令结束后,还是将它当成完整的一行输出(也就是说,应该是自动又加上换行符了)
    2.    有一位网友,觉得其他答案太复杂,给出了下面的方法
    sed ‘N;s/
    //g’

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

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

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

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

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




  • 相关阅读:
    Nodejs下载和第一个Nodejs示例
    永久关闭Win10工具栏的TaskbarSearch控件
    对称加密,非对称加密,散列算法,签名算法
    【转】TTL和RS232之间的详细对比
    zlg核心板linux系统中查看系统内存等使用信息
    Power BI后台自动刷新数据报错 The operation was throttled by Power BI Premium because there were too many datasets being processed concurrently.
    剪切板和上传文件内容获取
    CSS, LESS, SCSS, SASS总结
    文字程序
    electron 打包“ERR_ELECTRON_BUILDER_CANNOT_EXECUTE”
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284625.html
Copyright © 2011-2022 走看看