免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1736 | 回复: 9

[文本处理] awk遇到问题,求解 [复制链接]

论坛徽章:
0
发表于 2013-06-27 16:12 |显示全部楼层
1.问题一
先看结果
  1. [root@localhost tmp]# cat file
  2. name 1
  3. age 3

  4. name zhuotao
  5. age 4

  6. name cc
  7. age 5
复制代码
  1. [root@localhost tmp]# awk 'NR==7 {print}' file
  2. name cc
复制代码
  1. [root@localhost tmp]# awk -v a=$a 'NR==7{print}' file
  2. name 1
  3. age 3

  4. name zhuotao
  5. age 4

  6. name cc
  7. age 5
复制代码
请问为什么-v赋值变量后,还没使用变量,输出结果就不一样了?

问题二
同样是文本file
  1. [root@localhost tmp]# cat file
  2. name 1
  3. age 3

  4. name zhuotao
  5. age 4

  6. name cc
  7. age 5
复制代码
我想提取age 为5的name 即 “cc”,可否用一句awk解决?

感谢~

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2013-06-27 16:22 |显示全部楼层
本帖最后由 关阴月飞 于 2013-06-27 16:26 编辑

第一个问题,经测试没出现。
  1. [root@puppet awktest]# cat file
  2. name 1
  3. age 3

  4. name zhuotao
  5. age 4

  6. name cc
  7. age 5
  8. [root@puppet awktest]# awk -v a=$a 'NR==7{print}' file
  9. name cc
  10. [root@puppet awktest]#
复制代码
第二个问题:
  1. awk '/age 5/{print a}{a=$2}' urfile
复制代码

论坛徽章:
0
发表于 2013-06-27 16:27 |显示全部楼层
关阴月飞 发表于 2013-06-27 16:22
第一个问题,经测试没出现。
第二个问题:



请问如何理解 awk '/age 5/{print a}{a=$0}' file 能达到预期的效果
/age 5/找到后执行{} 里面的a如何理解。

thanks。

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2013-06-27 16:35 |显示全部楼层
mmwobuaini 发表于 2013-06-27 16:27
请问如何理解 awk '/age 5/{print a}{a=$0}' file 能达到预期的效果
/age 5/找到后执行{} 里面的a如 ...


/age 5/{print a}  #匹配 age 5 成功时,打印 变量a
a=$0                  #设置变量a的值为 $0


论坛徽章:
0
发表于 2013-06-27 16:35 |显示全部楼层
@mmwobuaini
同问

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
发表于 2013-06-27 16:43 |显示全部楼层
LZ你看下awk version输出下,我测试第一个问题没有。。。

论坛徽章:
0
发表于 2013-06-27 16:48 |显示全部楼层
关阴月飞 发表于 2013-06-27 16:35
/age 5/{print a}  #匹配 age 5 成功时,打印 变量a
a=$0                  #设置变量a的值为 $0


问题是为什么找到/age 5/后显示的却是上一条记录 “name cc ”
为什么显示的不是 “age 5”

论坛徽章:
50
15-16赛季CBA联赛之广夏
日期:2018-11-05 09:42:462015年亚冠纪念徽章
日期:2015-07-23 11:58:122015亚冠之广州富力
日期:2015-07-07 08:26:172015亚冠之塔什干棉农
日期:2015-06-29 09:08:072015年亚洲杯之伊朗
日期:2015-03-08 20:51:012015年迎新春徽章
日期:2015-03-04 09:58:11未羊
日期:2014-10-16 22:41:47处女座
日期:2014-10-16 15:33:33酉鸡
日期:2014-03-13 12:54:10巳蛇
日期:2014-03-10 14:39:052015亚冠之德黑兰石油
日期:2015-07-29 12:46:372015亚冠之德黑兰石油
日期:2015-08-07 12:54:11
发表于 2013-06-27 17:07 |显示全部楼层
本帖最后由 WilliBhamlll 于 2013-06-27 17:08 编辑

回复 7# mmwobuaini

我来回答一下吧。
首先要知道,awk是从第1行(记录)开始,逐行处理的。
awk '/age 5/{print a}{a=$0}'
读取输入文件第1行,/age 5/,条件不满足,不执行后面的action,即{print a},执行{a=$0},将第1行记录赋值给变量a。
读取输入文件第2行,/age 5/,条件不满足,不执行后面的action,即{print a},执行{a=$0},将第2行记录赋值给变量a,将覆盖变来的值。
.....
.....
读取到name cc这行时,/age 5/,条件不满足,不执行后面的action,即{print a},执行{a=$0},将该行记录赋值给变量a。
读取到age 5这行时,/age 5/,条件满足,执行后面的action,即{print a},此时变量a的值为name cc,正好打印出来。
   

论坛徽章:
0
发表于 2013-06-28 12:59 |显示全部楼层
WilliBhamlll 发表于 2013-06-27 17:07
回复 7# mmwobuaini

我来回答一下吧。


首先/***/{1}{2}是 匹配/***/成功执行{1}不成功执行{2} ?


然后 我想附加问个问题,这个解决了 我想显示匹配行的上一条记录,那如果是上2条记录 或者 3条呢 请问需要如何改,或者给个思路?

xiexie~

论坛徽章:
50
15-16赛季CBA联赛之广夏
日期:2018-11-05 09:42:462015年亚冠纪念徽章
日期:2015-07-23 11:58:122015亚冠之广州富力
日期:2015-07-07 08:26:172015亚冠之塔什干棉农
日期:2015-06-29 09:08:072015年亚洲杯之伊朗
日期:2015-03-08 20:51:012015年迎新春徽章
日期:2015-03-04 09:58:11未羊
日期:2014-10-16 22:41:47处女座
日期:2014-10-16 15:33:33酉鸡
日期:2014-03-13 12:54:10巳蛇
日期:2014-03-10 14:39:052015亚冠之德黑兰石油
日期:2015-07-29 12:46:372015亚冠之德黑兰石油
日期:2015-08-07 12:54:11
发表于 2013-06-28 13:13 |显示全部楼层
mmwobuaini 发表于 2013-06-28 12:59
首先/***/{1}{2}是 匹配/***/成功执行{1}不成功执行{2} ?


在上面的代码中,/***/匹配成功,执行{1},继续执行{2}。
  1. [WilliBhamlll@CC ~]$ cat file
  2. name 1
  3. age 3
  4. name zhuotao
  5. age 4
  6. name cc
  7. age 5
  8. [WilliBhamlll@CC ~]$ awk '/age 5/{for(i=NR-3;i<NR;i++)print a[i%3];exit}{a[NR%3]=$0}' file         
  9. name zhuotao
  10. age 4
  11. name cc
  12. [WilliBhamlll@CC ~]$ awk '/age 5/{for(i=NR-2;i<NR;i++)print a[i%2];exit}{a[NR%2]=$0}' file   
  13. age 4
  14. name cc
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP