免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk '{print $'$A'}' 1.txt的$A为什么能替换变量?? [复制链接]

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
21 [报告]
发表于 2015-04-10 17:39 |只看该作者
来总结下吧.....
  1. m=1
  2. n=a
  3. awk 'BEGIN{print $m}'
  4. awk 'BEGIN{print '$m'}'
  5. awk 'BEGIN{print '$n'}'
  6. awk 'BEGIN{a=1;print '$n'}'
  7. awk 'BEGIN{print "'$n'"}'
复制代码
以上...
外部定义的变量为数字时可以一对单引号直接引用.因为awk不允许数字变量名.
外部定义的变量为可以成为变量名的字符串时.一对单引号也是可以成功引用的,只不过引用过来的字符串被当成了变量名.由于没有赋值所以print结果为空
awk 内部区别字符与变量名的方法就是"",于是先一对单引号,再一对双引号,可以直接引用字符...
刚才说的片面了...抱歉啊楼主...

论坛徽章:
5
天秤座
日期:2015-04-08 20:28:42辰龙
日期:2015-04-08 20:35:06寅虎
日期:2015-04-08 20:35:56子鼠
日期:2015-04-08 20:36:192015亚冠之迪拜阿赫利
日期:2015-05-13 16:52:25
22 [报告]
发表于 2015-04-10 18:16 |只看该作者
回复 21# 我是一隻羊


        废了好大劲变更用户组了,能回帖了。
不明白你的意思啊。因为我对awk 怎么用的现在还不怎么熟悉。
不过不知道是不是你的理解有问题,刚有个人私信我的解答是引号最短匹配,我刚哥$A刚好在单引号外面。
所以awk 'BEGIN{print "'$n'"}'  这是什么意思我最后仍不明白,貌似测试结果出错的。

论坛徽章:
5
天秤座
日期:2015-04-08 20:28:42辰龙
日期:2015-04-08 20:35:06寅虎
日期:2015-04-08 20:35:56子鼠
日期:2015-04-08 20:36:192015亚冠之迪拜阿赫利
日期:2015-05-13 16:52:25
23 [报告]
发表于 2015-04-10 18:23 |只看该作者
回复 21# 我是一隻羊


awk '{print $'"$A"'}' 1.txt     # 注:"$A" 包在 soft quote 中
如果按最短匹配原则,这句也很好解释。

论坛徽章:
5
天秤座
日期:2015-04-08 20:28:42辰龙
日期:2015-04-08 20:35:06寅虎
日期:2015-04-08 20:35:56子鼠
日期:2015-04-08 20:36:192015亚冠之迪拜阿赫利
日期:2015-05-13 16:52:25
24 [报告]
发表于 2015-04-10 18:24 |只看该作者
回复 20# drakness

看我后面的回复。我怎么感觉你的引号用错了?
   

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
25 [报告]
发表于 2015-04-10 18:29 |只看该作者
a=2
echo "aa bb cc" | awk '{print $'$a'}'
说下个人理解,单引号会阻止shell其中的内容进行解析,会把其中的内容当成一个简单的字串,那么awk '{print $'$a'}'就会被分成三部分
awk '{print $'
$a
'}'
第二部分没有被单引号包裹,shell解析出它的值为2,然后重组命令为awk '{print $'2'}' ,shell解析完毕后,传给awk的是shell自认为的字串,即:awk '{print $2}'
到此为止的动作都是,shell完成的,和awk还没有什么关系,
接下来print $0就会被当成参数传给awk,打印出第二个字段

小学没毕业,理解描述的都可能有问题,若有问题请指正

论坛徽章:
5
天秤座
日期:2015-04-08 20:28:42辰龙
日期:2015-04-08 20:35:06寅虎
日期:2015-04-08 20:35:56子鼠
日期:2015-04-08 20:36:192015亚冠之迪拜阿赫利
日期:2015-05-13 16:52:25
26 [报告]
发表于 2015-04-10 18:40 |只看该作者
本帖最后由 ywmkelly 于 2015-04-10 18:41 编辑

回复 25# jeffreyst

和我理解的一样,但是 你这个解析顺序也错了吧。引号先与变量解析的。

论坛徽章:
10
2015年亚洲杯之科威特
日期:2015-04-13 13:51:5315-16赛季CBA联赛之山东
日期:2016-01-16 18:35:0815-16赛季CBA联赛之广东
日期:2016-01-04 15:26:23程序设计版块每日发帖之星
日期:2015-11-13 06:20:002015亚冠之阿尔艾因
日期:2015-11-10 12:32:242015亚冠之阿尔沙巴布
日期:2015-05-15 18:26:49羊年新春福章
日期:2015-04-28 16:45:112015年亚洲杯之伊拉克
日期:2015-04-25 20:06:30羊年新春福章
日期:2015-04-13 13:53:2015-16赛季CBA联赛之八一
日期:2016-01-20 18:23:49
27 [报告]
发表于 2015-04-11 02:09 |只看该作者
回复 24# ywmkelly


    额,我是针对那哥们的提法说的,

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
28 [报告]
发表于 2015-04-11 07:58 |只看该作者
本帖最后由 我是一隻羊 于 2015-04-11 08:10 编辑

回复 23# ywmkelly

我最前面其实就说过了啊,单引号的生效范围是到下一个单引号.不是最后一个...不知道你觉得这句跟最短匹配有什么冲突?
上面的总结,不是说每个都能正确引用,只是通过不同的结果来说明awk究竟是怎样来引用的.都跑一下你应该就能清楚了.
我再细说明下....
  1. n=1
  2. awk 'BEGIN{print '$n'}'
复制代码
相当于
  1. awk 'BEGIN{print 1}'
复制代码
由于1不能被当做变量名,所以这里的1被当做字符,直接打印出来.执行结果为"1"
  1. n=a
  2. awk 'BEGIN{print '$n'}'
复制代码
相当于
  1. awk 'BEGIN{print a}'
复制代码
注意这里a被当做了变量名.由于并没有在这个awk语句中定义a的值,所以这里的执行结果为"空"
来验证一下我的说法
  1. awk 'BEGIN{a=test;print '$n'}'
复制代码
你a定义的是什么,输出结果就是什么.

那么怎么能引用字符a呢.
首先要构造
  1. awk 'BEGIN{print "a"}'
复制代码
awk中可以用"来区别字符与变量名.
然后将外部变量以单引号引入.
  1. awk 'BEGIN{print "'$n'"}'
复制代码
注意,像你举得例子.
  1. awk 'BEGIN{print '"$n"'}'
复制代码
这样是不行的,"被放到了'外面.这样就被shell去解释了,而不是awk
最后还是相当于
  1. awk 'BEGIN{print a}'
复制代码
结果依旧为空.


不知楼主还有什么疑惑么?

论坛徽章:
5
天秤座
日期:2015-04-08 20:28:42辰龙
日期:2015-04-08 20:35:06寅虎
日期:2015-04-08 20:35:56子鼠
日期:2015-04-08 20:36:192015亚冠之迪拜阿赫利
日期:2015-05-13 16:52:25
29 [报告]
发表于 2015-04-11 11:45 |只看该作者
回复 28# 我是一隻羊


   多谢回复,原来我们说的不是同一个事。

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
30 [报告]
发表于 2015-04-11 13:56 |只看该作者
回复 29# ywmkelly

你是怎么理解的我们说的不是一个事呢.......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP