如何将变量传递给awk命令行

use*_*576 2 bash shell awk

我在将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
Run Code Online (Sandbox Code Playgroud)

我想要列的最后一行,我希望它是灵活的或用户输入.例如,用户可能还需要列6,7和8,或者列133和138,或者列245到248.因此,我如何自定义此项,以便我可以将'print $ 2 .... $ 5'设置为用户输入的东西?例如,用户将运行此脚本,如:bash script.sh input_dir output_dir [用户输入任何列的列],然后我将在输出中获取这些列.我尝试传入它,但我想我没有正确的语法.

小智 6

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

awk -v var1="$col1" -v var2="$col2" 'BEGIN {print var1,var2 }'
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*zyz -3

以下测试对我有用:

A="\$3" ; ls -l | awk "{ print $A }"
Run Code Online (Sandbox Code Playgroud)