【问题标题】:how to pass in a variable to awk commandline如何将变量传递给awk命令行
【发布时间】:2016-10-21 13:16:01
【问题描述】:

我在将 bash 脚本变量传递到 awk 命令行时遇到了一些问题。

这是伪代码:

for FILE in $INPUT_DIR/*.txt; do
 filename=`echo $FILE | sed -n 's/^.*\(chr[0-9A-Z]*\).*.vcf$/\1/p'`
 OUTPUT_FILE=$OUTPUT_DIR/$filename.snps.txt
 egrep -v "^#" $FILE | awk '{print $2,$4,$5}' > $OUTPUT_FILE
done

我 awk 列的最后一行,我希望它是灵活的或用户输入。例如,用户可能还想要第 6,7 和 8 列,或第 133 和 138 列,或第 245 到 248 列。那么我该如何自定义它,以便我可以让“打印 $2 .... $5”成为用户输入的东西?例如,用户会像这样运行这个脚本:bash script.sh input_dir output_dir [用户输入任何列的字符串],然后我会在输出中得到这些列。我试着把它传入,但我想我的语法不正确。

【问题讨论】:

标签: bash shell awk


【解决方案1】:

使用 awk,您应该在使用之前声明变量。这比转义方法好(awk '{print $'$var'}'):

awk -v var1="$col1" -v var2="$col2" 'BEGIN {print var1,var2 }'

其中 $col1 和 $col2 将是输入变量。 也许您可以尝试使用 "$2,$4,$5" 将输入变量作为字符串并打印此变量以获取值(我不确定这是否有效)

【讨论】:

    【解决方案2】:

    以下测试适用于我:

    A="\$3" ; ls -l | awk "{ print $A }"
    

    【讨论】:

    • 这很容易受到格式错误的输入的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多