免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4592 | 回复: 25
打印 上一主题 下一主题

[文本处理] 求助用awk进行有关数字的替换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-15 21:04 |只看该作者 |倒序浏览
本帖最后由 sxingbai 于 2013-05-15 22:14 编辑

初学awk,本想自己摸索,却发现这里热心的高手很多,可以帮助自己少走弯路。
假设有一个文本my:
wang 12 qian 45 67 sun 22
31 tang 77 89 43 li
nan 78
我想由此新建两个文本
1.使文本中的数字都替换为它的2倍;
2.根据数字在每行出现的顺序,在其前加上相应的序号,比如`1`

1.
wang 24 qian 50 134 sun 44
62 tang 154 178 86 li
nan 156
2.
wang `1`12 qian `2`45 `3`67 sun `4`22
`1`31 tang `2`77`3` 89 `4`43 li
nan `1`78
请问用awk如何处理。先行感谢!

论坛徽章:
0
2 [报告]
发表于 2013-05-15 21:33 |只看该作者
楼主,解释下最终两个文本的内容
第一个文件:wang 24 qian 90 .....
第二个文件:文本中的数字需要替换为2倍吗,每行第一个数字的序号都为1吗,还是说整个文件中数字的出现的次序

论坛徽章:
0
3 [报告]
发表于 2013-05-15 21:55 |只看该作者
本帖最后由 sxingbai 于 2013-05-15 22:15 编辑

已修改提问,期待指点。

论坛徽章:
0
4 [报告]
发表于 2013-05-15 22:19 |只看该作者
看来大家都睡觉了,明天再来学习。

论坛徽章:
0
5 [报告]
发表于 2013-05-16 00:36 |只看该作者
本帖最后由 uarenotalone 于 2013-05-16 20:03 编辑

awk 'BEGIN{i=1;ORS=" "; }   { print i++,"\n";for(j=1;j<=NF;j++ ){ if($j~/[0-9]/){ a=$j*2;print a;}else{ print $j;}}  print "\n";       }'   test_1


就先写这一条吧,

论坛徽章:
0
6 [报告]
发表于 2013-05-16 08:49 |只看该作者
回复 5# uarenotalone
多谢!
思路应该是正确的,遍历各字段看是否数字,是则乘2,否则不动。第2个道理应该相通。
但复制代码测试却提示许多语法错误,我正是初学awk,对语句语法很不清楚,希望能给出正确的写法。


   

论坛徽章:
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
7 [报告]
发表于 2013-05-16 09:03 |只看该作者
本帖最后由 yestreenstars 于 2013-05-16 09:03 编辑
  1. [root@localhost ~]# cat i
  2. wang 12 qian 45 67 sun 22
  3. 31 tang 77 89 43 li
  4. nan 78
  5. [root@localhost ~]# awk '{for(i=1;i<=NF;i++)if($i~/^[0-9]+$/)$i*=2}1' i         
  6. wang 24 qian 90 134 sun 44
  7. 62 tang 154 178 86 li
  8. nan 156
  9. [root@localhost ~]# awk '{for(i=1;i<=NF;i++)if($i~/^[0-9]+$/)$i="`"++j"`"$i;j=""}1' i
  10. wang `1`12 qian `2`45 `3`67 sun `4`22
  11. `1`31 tang `2`77 `3`89 `4`43 li
  12. nan `1`78
  13. [root@localhost ~]#
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-05-16 09:18 |只看该作者
本帖最后由 yinwei2012 于 2013-05-16 14:25 编辑

回复 1# sxingbai

1.
awk '{for(i=1;i<=NF;i++){if($i~/[0-9]+/)$i*=2;}print $0}'
2.
awk '{for(i=1;i<=NF;i++){if($i~/[0-9]+/){a++;$i="`"a"`"$i;}}a=0;print $0}'

论坛徽章:
0
9 [报告]
发表于 2013-05-16 09:32 |只看该作者
回复 7# yestreenstars
十分感谢!代码如此简洁!
但我愚钝,有几处不懂,麻烦解疑:
1.语句最后的1指什么,怎么用?
2.第二个句子中的j为什么指定为空字符?
3.循环语句应该包含条件语句,后面可以不用花括号吗?


   

论坛徽章:
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
10 [报告]
发表于 2013-05-16 09:38 |只看该作者
1.http://bbs.chinaunix.net/forum.p ... mp;fromuid=26669282

2.不清空的话会影响下一行的计数,假如没有j="",那么下一行的第一个数字就会变成`5`31,这里的j可以指定为空,也可以指定为0,目的只有一个,就是清空j的值。

3.可以,但嵌套的语句必须是单一的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP