将bashvariables作为模式传递给awk

我想知道如何将一个bash variable作为pattern传递给awk 。 我已经阅读了几个Q / A,这些Q / A往往回答同样的问题,但是,他们没有解决我的问题(可能,我错过了一些东西!)。

我有几个这样的文件:

 1 9909 23121 1 23121 561510 3 75879819 75902940 3 75902940 75916152 4 75916152 75982212 3 75982212 75998727 22 82964754 83232297 X 59962662 60745473 

我想创build不同的文件,每个文件都包含相同的起始模式,我只想提取第2列,例如包含以1开头的所有行的第2列的文件,另一个文件包含以X开头的行的第2列等。

我的代码如下所示:

 for x in *.CNVs; do for y in `seq 22` XY; do awk '/^$y/ {print $2}' $x > freec_${x}_${y}_st.txt; done; done; 

我也尝试使用这样的-v选项:

 for x in *.CNVs; do for y in `seq 22` XY; do awk -v pattern="{$y}" '/^pattern/ {print $2}' $x > freec_${x}_${y}_st.txt; done; done; 

我没有得到任何错误,所有的文件被创build; 然而,他们都是空的! 任何build议,非常感谢!

[ 编辑 ]我find了一个整洁的方式使用grep (之前,我想这不能由grep完成!):

 for x in *.CNVs; do for y in `seq 22` XY; do grep "^${y}\s" $x | cut -f2 > ${x}_${y}_st.txt; done; done; 

使用grep是有帮助的,因为使用\s ,我可以区分从2,21和22开始的行。

变量在正则表达式文字( /.../ )中没有扩展。 您需要使用~运算符和字符串文字。

 awk -v pattern="$y" '$0 ~ "^"pattern {print $2}' "$x" > "freec_${x}_${y}_st.txt" 

你还需要小心任何模式元字符/等。 在模式中。