免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1951 | 回复: 6
打印 上一主题 下一主题

请教AWK问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-28 11:12 |只看该作者 |倒序浏览
有以下文本,只是截取其中一小段,实际的文本有好几十M
test.txt
需要将文本中最后的A[1-2]替换成前面的[1-8]
awk -F! 'if ($5 ~/A[1-2]/) {$5 = $ 4; print $0 > "change.txt";}' test.txt

S!$3I309\$6N12!RN6030!8!A2!!!
S!CPU_LA3!RN6030!4!A1!!!
S!CPU_LA2!RN6030!3!A1!!!
S!CPU_LA1!RN6030!2!A1!!!
S!$3I309\$6N13!RN6030!7!A2!!!
S!$3I309\$6N14!RN6030!6!A2!!!
S!$3I309\$6N15!RN6030!5!A2!!!
S!CPU_LD12!RN6029!1!A1!!!
S!$3I309\$6N47!RN6029!8!A2!!!
S!CPU_LD15!RN6029!4!A1!!!
S!CPU_LD14!RN6029!3!A1!!!
S!CPU_LD13!RN6029!2!A1!!!
S!$3I309\$6N48!RN6029!7!A2!!!
S!$3I309\$6N49!RN6029!6!A2!!!
S!$3I309\$6N50!RN6029!5!A2!!!
S!CPU_LD8!RN6028!1!A1!!!
S!$3I309\$6N42!RN6028!8!A2!!!
S!CPU_LD11!RN6028!4!A1!!!
S!CPU_LD10!RN6028!3!A1!!!
S!CPU_LD9!RN6028!2!A1!!!
S!$3I309\$6N43!RN6028!7!A2!!!
S!$3I309\$6N44!RN6028!6!A2!!!
S!$3I309\$6N45!RN6028!5!A2!!!
S!CPU_LD4!RN6027!1!A1!!!
S!$3I309\$6N37!RN6027!8!A2!!!
S!CPU_LD7!RN6027!4!A1!!!
S!CPU_LD6!RN6027!3!A1!!!
S!CPU_LD5!RN6027!2!A1!!!
S!$3I309\$6N38!RN6027!7!A2!!!
S!$3I309\$6N39!RN6027!6!A2!!!
S!$3I309\$6N40!RN6027!5!A2!!!
S!CPU_LD0!RN6026!1!A1!!!
S!$3I309\$6N32!RN6026!8!A2!!!
S!CPU_LD3!RN6026!4!A1!!!
S!CPU_LD2!RN6026!3!A1!!!
S!CPU_LD1!RN6026!2!A1!!!
S!$3I309\$6N33!RN6026!7!A2!!!
S!$3I309\$6N34!RN6026!6!A2!!!
S!$3I309\$6N35!RN6026!5!A2!!!


可是执行后发现变成了
S $3I309\$6N12 RN6030 8 8   
S CPU_LA3 RN6030 4 4   
S CPU_LA2 RN6030 3 3   
S CPU_LA1 RN6030 2 2   
S $3I309\$6N13 RN6030 7 7   
S $3I309\$6N14 RN6030 6 6   
S $3I309\$6N15 RN6030 5 5   
S CPU_LD12 RN6029 1 1   
S $3I309\$6N47 RN6029 8 8   
S CPU_LD15 RN6029 4 4   
S CPU_LD14 RN6029 3 3   
S CPU_LD13 RN6029 2 2   
S $3I309\$6N48 RN6029 7 7   
S $3I309\$6N49 RN6029 6 6   
S $3I309\$6N50 RN6029 5 5   
S CPU_LD8 RN6028 1 1   
S $3I309\$6N42 RN6028 8 8   
S CPU_LD11 RN6028 4 4   
S CPU_LD10 RN6028 3 3   
S CPU_LD9 RN6028 2 2   
S $3I309\$6N43 RN6028 7 7   
S $3I309\$6N44 RN6028 6 6   
S $3I309\$6N45 RN6028 5 5   
S CPU_LD4 RN6027 1 1   
S $3I309\$6N37 RN6027 8 8   
S CPU_LD7 RN6027 4 4   
S CPU_LD6 RN6027 3 3   
S CPU_LD5 RN6027 2 2   
S $3I309\$6N38 RN6027 7 7   
S $3I309\$6N39 RN6027 6 6   
S $3I309\$6N40 RN6027 5 5   
S CPU_LD0 RN6026 1 1   
S $3I309\$6N32 RN6026 8 8   
S CPU_LD3 RN6026 4 4   
S CPU_LD2 RN6026 3 3   
S CPU_LD1 RN6026 2 2   
S $3I309\$6N33 RN6026 7 7   
S $3I309\$6N34 RN6026 6 6   
S $3I309\$6N35 RN6026 5 5   

中间的域分隔符咋没有了

新手诚求指教,谢谢!

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
2 [报告]
发表于 2011-06-28 11:22 |只看该作者
加上 -vOFS='!'

另外的,你的代码有问题吧,花括号呢?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2011-06-28 11:23 |只看该作者
回复 1# denghaipeng


    awk -F! 'if ($5 ~/A[1-2]/) {$5 = $ 4; print $0 > "change.txt";}' OFS='!'  test.txt

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
4 [报告]
发表于 2011-06-28 11:24 |只看该作者
加上 -vOFS='!'

另外的,你的代码有问题吧,花括号呢?

测试数据列出2行就行了,没必要全部列出来,吓的大家不敢回答你的问题

论坛徽章:
0
5 [报告]
发表于 2011-06-28 11:30 |只看该作者
,谢谢各位大侠指教,明白了!

论坛徽章:
0
6 [报告]
发表于 2011-06-28 11:38 |只看该作者
回复 4# liion631818

   你好,请问下
    如果要匹配RN6029就是RN后面跟1-4个数字的正则表达式这样写对不对,/RN[0-9]{1,4}/,我这样写了在awk中运行后没有报错可是也没有匹配上
  请指教

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
7 [报告]
发表于 2011-06-28 12:17 |只看该作者
回复 6# denghaipeng


    加上 --posix 选项
用"P"标记的项表示是POSIX标准指定的
符号 ed ex vi sed awk grep egrep 动作
.      Y   Y  Y   Y    Y    Y      Y      匹配任意一个字符
*     Y   Y  Y   Y    Y    Y      Y      匹配0个或多个之前的字符
^    Y   Y  Y   Y    Y    Y      Y      匹配一行或一个字符串的开始部分
$                                             匹配一行或一个字符串的结束部分
\     Y   Y  Y   Y    Y    Y      Y     不匹配之后的字符
[]    Y   Y  Y   Y    Y    Y      Y     从一个字符集中匹配一个字符
\( \) Y  Y  Y   Y          Y             为以后的回放来存放模式
\n   Y   Y  Y   Y          Y             重放之前存储的某个模式
{ }                    YP           YP   匹配一个范围的实例
\{ \} Y         Y          Y              匹配一个范围的实例
\< \> Y Y Y                              在一个词的词首或词尾匹配
+                        Y           Y      匹配之前的一个或多个字符
?                        Y            Y     匹配之前的零个或一个字符
|                         Y           Y     隔离匹配的选择
()                    Y            Y     用于匹配的一组表达式
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP