awk与sed:关于多行的样本

awk与sed:关于多行的样本

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

  几天前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 123456789012345678901234567890

能够看出,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的差别





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117721.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月1日 下午2:00
下一篇 2022年1月1日 下午3:00


相关推荐

  • Tomcat:第二章:Tomcat日志文件分析

    Tomcat:第二章:Tomcat日志文件分析Tomcat下载地址:https://tomcat.apache.org/download-80.cgitomcat源码下载:tomcat目录结构:打开Tomcat的日志目录,也就是Tomcat安装目录下的logs目录。Tomcat的日志信息分为两类:一是运行日志,它主要记录运行过程中的一些信息,尤其是一些异常错误日志信息; 二是访问日志,它记录访问的时间、IP地址、访问的路径等相关信息。日志文件类型分析:catalina.***.log:主

    2022年6月20日
    35
  • MacOS PyCharm添加Qt Designer(笔记)

    MacOS PyCharm添加Qt Designer(笔记)一 下载 Anaconda 并安装 https www anaconda com products individual 至于配置 Anaconda 的环境 在这里就不赘述了 二 打开 PyCharm 的 Preferences gt Tools gt ExternalTool 点击加号三 选择 Designer 所在的目录 Users xxx opt anaconda3 bin Designer app 点击 OKDONE 希望能帮到你

    2026年3月27日
    1
  • js如何获取计算机当前时间,js获取当前系统时间实例代码

    js如何获取计算机当前时间,js获取当前系统时间实例代码在javascript中使用date日期函数,取得当前系统时间的方法:varmydate=newdate();mydate.getyear();//获取当前年份(2位)mydate.getfullyear();//获取完整的年份(4位,1970-????)mydate.getmonth();//获取当前月份(0-11,0代表1月)mydate.getdate();…

    2022年10月18日
    4
  • Document类型、HTMLDocument类型和document对象的区别[通俗易懂]

    Document类型、HTMLDocument类型和document对象的区别[通俗易懂]Dcoment表示文档,这里的文档可以是HTML文档,也可以是XML文档,换句话说Document类型能表示HTML和XML等文档; HTMLDocument对象继承自Document对象,专用于表示HTML文档; document对象是HTMLDocument对象的一个实例,表示整个HTML页面,又叫做页面的根节点;Document对象(根节点)的特征:<!DOCTYPEht…

    2022年7月19日
    33
  • 函数 Func

    函数 Func1 函数函数是用来完成特定任务的独立代码块 函数的参数 参数可以提供默认值 用来简化函数调用 参数可以当做传入参数也可以当做传出参数 即传入的参数值可以被修改 所有参数放在圆括号内函数的返回值 与 OC 的语法不通 以 func 关键字为前缀 有返回值用 来表示用返回值 并添加返回值类型函数类型 函数类型包括参数值类型和返回值类型 每一个函数类型可以当做是普通的类型来处理 可以做函数的

    2026年3月20日
    2
  • gb50174-2017数据中心机房等级标准_计算机机房设计标准GB50174

    gb50174-2017数据中心机房等级标准_计算机机房设计标准GB501742.0.1数据中心datacenter为集中放置的电子信息设备提供运行环境的建筑场所,可以是一栋或几栋建筑物,也可以是一栋建筑物的一部分,包括主机房、辅助区、支持区和行政管理区等。2.0.2灾备数据中心businessrecoverydatacenter用于灾难发生时,接替生产系统运行,进行数据处理和支持关键业务功能继续运作的场所,包括限制区、普通区和专用区。2.0.3主机房c…

    2022年10月2日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号