免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: c386
打印 上一主题 下一主题

[文本处理] 【已经解决】基于DNS的字符替换问题 [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
11 [报告]
发表于 2014-04-29 00:17 |只看该作者
  1. sed -r 'N;/\n\s+/s/(\S+)(.*)\n(.*)/\1\2\n\1\3/;P;D'
复制代码

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
12 [报告]
发表于 2014-04-29 08:55 |只看该作者
学习中,mark~

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
13 [报告]
发表于 2014-04-29 10:09 |只看该作者
  1. awk '$1!~/IN/{c=$1}$1~/IN/{gsub(/^/,c)}1' o
复制代码

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
14 [报告]
发表于 2014-04-29 10:28 |只看该作者
回复 2# ly5066113


    你好,
您的这个语句awk 'NF==3{$0=s""$0}{s=$1}1' file和awk '{if(NF==3){$0=s""$0}else{s=$1}{print}}' file
好像是一样的,您的语句是后面那个的简写吗?我在哪里可以找到这种用法的介绍?多谢!

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
15 [报告]
发表于 2014-04-29 10:39 |只看该作者
回复 14# jeffreyst
这两句不等价呀,原来的写法
s=$1这句对任意行肯定会执行;
你的写法这句只对NF!=3的行会执行,
当然,对于这个文本,得到的结果应该
是一样的。


   

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
16 [报告]
发表于 2014-04-29 11:59 |只看该作者
回复 15# Herowinter


    awk 'NF==3{$0=s""$0}{s=$1}1' file,可能是我没有太理解这个语句的执行过程
    我原来理解的这个语句的执行过程是:
    1.从目标文件中读出一行,
    2.若满足条件NF==3就执行{$0=s""$0},否则执行{s=$1}
    3.最后执行1,即print

    但是从你的解释来看,这个语句的执行过程好像应该是:
    1.从目标文件中读出一行,
    2.若满足条件NF==3就执行{$0=s""$0},
    3.执行{s=$1}
    4.最后执行1,即print
     即awk '{if(NF==3){$0=s""$0}{s=$1}}1'  file,
     我理解的这个过程正确吗?

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
17 [报告]
发表于 2014-04-29 13:01 |只看该作者
回复 16# jeffreyst
你的第二个理解是对的,可以看这个,
每一行都执行了s=$1这个块。
  1. awk 'NF==3{$0=s""$0}{s=$1;print NR":"s}' i
  2. 1:www
  3. 2:www
  4. 3:www1
  5. 4:www1
  6. 5:www1
  7. 6:www1
  8. 7:www1
  9. 8:www1
  10. 9:www1
  11. 10:www1

  12. cat i
  13. www     IN              A       192.168.1.2
  14.             IN              A      192.168.1.3
  15. www1    IN              A       1.1.1.1
  16.             IN              A       1.1.1.2
  17.             IN              A       1.1.2.3
  18.             IN              A       1.1.1.4
  19.             IN              A       1.1.2.5            
  20.             IN              A       1.1.2.6           
  21.             IN              A       1.1.2.7         
  22.             IN              A       1.1.2.8
复制代码

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
18 [报告]
发表于 2014-04-29 15:56 |只看该作者
回复 17# Herowinter


    我好好理解下,多谢多谢!
     另外,我想问下NR==3是if(NR==3)的简写方式吗?我没有见过这种用法,在哪里可以找到对这种用法的解释?

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
19 [报告]
发表于 2014-04-29 16:45 |只看该作者
回复 17# Herowinter


    虽然我没有找到关于这个写法的文档,但是我这样试了下:
  1. [root@/workspace]# head -10 111
  2.      1  zqxzvg[]lmoxaduib]lh
  3.      2  a[llf]uoh[jchohhamsa
  4.      3  nzqsteqxhy]ntdrotjmt
  5.      4  lerfyqvaratlmdlonprd
  6.      5  vlif[]ymmtf]izlrdtan
  7.      6  jbqkbzantixgzp]hjoud
  8.      7  xtszrwycarjjctivtjdn
  9.      8  msxfvcziztap[kaavfzy
  10.      9  jg]knpdd[vqltcmbnzmd
  11.     10  vlmbvlslrt]nstlfpduc
  12. [root@/workspace]#
  13. [root@/workspace]# head -10 111 | awk 'NR>3{print $0}{print NR}'
  14. 1
  15. 2
  16. 3
  17.      4  lerfyqvaratlmdlonprd
  18. 4
  19.      5  vlif[]ymmtf]izlrdtan
  20. 5
  21.      6  jbqkbzantixgzp]hjoud
  22. 6
  23.      7  xtszrwycarjjctivtjdn
  24. 7
  25.      8  msxfvcziztap[kaavfzy
  26. 8
  27.      9  jg]knpdd[vqltcmbnzmd
  28. 9
  29.     10  vlmbvlslrt]nstlfpduc
  30. 10
  31. [root@/workspace]#
复制代码
这个测试,可以说明,NR>3和if(NR>3)是等价的,并且能说明后面的print NR是不受前面的条件限制的,每一次都打印,再次感谢!

论坛徽章:
1
水瓶座
日期:2014-05-16 13:42:25
20 [报告]
发表于 2014-04-29 19:29 |只看该作者
awk 'NF==3{$0=s""$0}{s=$1}1' 运行后无效
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP