【问题标题】:Howto Pass A String as Parameter in AWK within Bash Script如何在 Bash 脚本中的 AWK 中将字符串作为参数传递
【发布时间】:2011-11-17 11:00:51
【问题描述】:

我有一个要过滤的文本文件 使用 awk。文本文件如下所示:

foo 1
bar 2
bar 0.3
bar 100
qux 1033

我想在 bash 脚本中使用 awk 过滤这些文件。

#!/bin/bash

#input file
input=myfile.txt

# I need to pass this as parameter
# cos later I want to make it more general like
# coltype=$1
col1type="foo"   

#Filters
awk '$2>0 && $1==$col1type' $input

但不知何故,它失败了。正确的做法是什么?

【问题讨论】:

    标签: linux bash unix awk


    【解决方案1】:

    使用awk-v 选项传递它。这样,您就可以分离出 awk 变量和 shell 变量。它也更整洁,没有额外的引用。

    #!/bin/bash
    
    #input file
    input=myfile.txt
    
    # I need to pass this as parameter
    # cos later I want to make it more general like
    # coltype=$1
    col1type="foo"   
    
    #Filters
    awk -vcoltype="$col1type" '$2>0 && $1==col1type' $input
    

    【讨论】:

    • '-v' 符号是 POSIX 兼容的;较旧的(System V-ish)版本的 awk 也可能允许 parameter=value 不带 '-v' 选项。最好是明确的 - 使用“-v”,除非你的系统有问题。
    • 如果你确实使用了纯parameter=value 语法(没有-v 前缀),它必须在'$2>0 ...'$input 参数之间。但我怀疑有很多系统不再接受-v,最好尽可能使用它。此外,这种方法比 John Kugelman 的回答更可靠:如果 coltype 保持值 xyz{next} {print "garbage"} 会怎样?
    【解决方案2】:

    "双引号单引号"

    awk '{print "'$1'"}'
    


    例子:

    $./a.sh arg1 
    arg1
    


    $cat a.sh 
    echo "test" | awk '{print "'$1'"}'
    


    Linux 测试

    【讨论】:

    • 谢谢!我是个新手,找了几个小时如何简单地将 shell 变量字符串导入(有点复杂)awk 表达式。
    【解决方案3】:

    您需要双引号来允许变量插值,这意味着您需要使用反斜杠转义其他美元符号,因此$1$2 插值。您还需要在"$col1type" 周围加上双引号。

    awk "\$2>0 && \$1==\"$col1type\"" 
    

    【讨论】:

      【解决方案4】:

      单引号抑制 bash 中的变量扩展:

      awk '$2>0 && $1=='"$col1type"
      

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 2012-01-23
        • 1970-01-01
        • 2016-09-15
        • 2012-10-21
        • 2018-06-25
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多