zoukankan      html  css  js  c++  java
  • awk内引用shell变量【自己手动加精】

    题目

    [root@localhost ~]# cat 1.txt
    iii
    sss
    ddd
    

      

    执行命令

    [root@localhost ~]# A=0
    [root@localhost ~]# awk '{print $$A}' 1.txt
    iii
    sss
    ddd
    

      

    按道理应该是语法错误,正确的应该这样写

    awk '{print $'$A'}' 1.txt
    

      

    在awk中,$是有特殊含义的字符,会被解释成字段操作符

    awk '{print $$A}' 相当于 awk '{print $($A)}' => awk '{print $0}'

    ================================================================
    为了跟清楚的解释,新建urfile,这样就能看出区别了

    [root@localhost ~]# cat urfile
    iii 1
    sss
    ddd
    [root@localhost ~]# awk '{print $$A}' urfile
    iii 1
    sss
    ddd
    [root@localhost ~]# cat urfile
    1 iii
    sss
    ddd
    [root@localhost ~]# awk '{print $$A}' urfile
    1
    sss
    ddd
    

      

    再看awk '{print $$A}' 相当于 awk '{print $($A)}'这句话,就能理解了

    这里($A)解释为第A个字段,而A在awk中是未设置的变量,数值为0

    [root@localhost ~]# echo | awk '{print A}'
    
    [root@localhost ~]# echo | awk '{print A+0}'
    0
    

      

    $0在awk中表示整行,而awk又是行处理器
    所以得出
    $$A => $($A) => $($0) => $("1 iii")
    这个结果

    最后$("1 iii") => $1

    [root@localhost ~]# awk '{print $"1 iii"}' urfile 
    1
    sss
    ddd
    [root@localhost ~]# awk '{print $1 iii}' urfile 
    1
    sss
    ddd
    

      



    在awk中,"1 iii",被分割成'1','iii'两段,
    空格(space) 是 awk 的字符串连接操作符。

    print $1 iii       #表示将$1跟iii连接打印出来
    iii,没有引号就是当作变量名

    [root@localhost ~]# awk '{print iii}' urfile 
    
    
    
    [root@localhost ~]# awk '{print $1 12}' urfile 
    112
    sss12
    ddd12
    [root@localhost ~]# awk '{print $iii iii}' urfile 
    1 iii
    sss
    ddd
    [root@localhost ~]# awk '{print $iii "iii"}' urfile 
    1 iiiiii
    sssiii
    dddiii
    [root@localhost ~]# awk -viii=1 '{print $1 iii}' urfile 
    11
    sss1
    ddd1
    [root@localhost ~]# awk -viii=iii '{print $1 iii}' urfile 
    1iii
    sssiii
    dddiii
    

      

    连起来理解就是[print $1 iii] print$1空格(连接符)iii(awk内置变量,未设置,为空)

    最后南宁@黑哥给了关于awk中变量的理解

    [root@localhost ~]# echo "foo bar foobar" | awk '{A=1;print "A:"A;print "$A: "$A}'
    A:1
    $A: foo
    

      



    感谢南宁@黑哥的指导

  • 相关阅读:
    05391
    05390
    05389
    05388
    1006 Sign In and Sign Out (25分)
    1002 A+B for Polynomials (25分)
    1005 Spell It Right (20分)
    1003 Emergency (25分)
    1001 A+B Format (20分)
    HDU 2962 Trucking
  • 原文地址:https://www.cnblogs.com/irockcode/p/6984565.html
Copyright © 2011-2022 走看看