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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何启用计算机的休眠,电脑休眠

    如何启用计算机的休眠,电脑休眠电脑休眠指的是将当前处于运行状态的数据保存在硬盘中,整机将完全停止供电。[1]在休眠时可以完全断开电脑的电源,自动关闭显示器和硬盘的时间设置为多长时间比较合适应看你需要了。中文名电脑休眠处于运行状态的数据保存在硬盘中存储在硬盘中进入休眠状态和唤醒的速度都相对较慢电脑休眠工作模式编辑语音为什么需要休眠尽管电脑硬件运行速度越来越快,但操作系统的体积也在不断膨胀,使得电脑开、关机…

    2022年7月12日
    10
  • Linux终端连接Linux服务器

    Linux终端连接Linux服务器

    2021年10月15日
    42
  • MyBatis返回复杂Map结果集「建议收藏」

    MyBatis返回复杂Map结果集「建议收藏」MyBatis返回复杂结果集key为指定属性,value为实体类结果集mybatis返回map,key为指定属性,value为实体类结果集

    2022年10月4日
    0
  • 单片机交通信号灯控制系统设计_交通灯控制电路设计图

    单片机交通信号灯控制系统设计_交通灯控制电路设计图交通信号灯控制系统设计 作为一个硬件程序设计民工,最近一直在学习python,写个爬虫,排个序,再画个界面,其实还是挺好玩的。然而这不是我的主业啊!!!-_-|||下学期开学就要找工作了,明天刚好是新的一个月,还是滚回去调我的FPGA吧。今天先更新一个很小很小的例子作为开端,这是前几天xxx给我出的一道很随意的题目,主要是看面对一个项目…

    2022年9月24日
    0
  • css+div网页设计(一)–基础知识

    css+div网页设计(一)–基础知识

    2021年12月10日
    48
  • win10cpu睿频怎么关闭_cpu睿频上不去

    win10cpu睿频怎么关闭_cpu睿频上不去笔记本非节能模式下默认开睿频,非常烫手。关闭睿频,步骤如下:打开注册表编辑器=>地址栏输入=>将值改为0=>打开——>——>——>——>——>设置为非要打开睿频的话,笔记本建议使用高性能高效率,频率高,温度相对低,算是一个折中的方案。台式机不清楚,自行测试,可以使用CoreTemp监控温度和频率。…

    2022年9月15日
    0

发表回复

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

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