我想知道如何将一个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"
你还需要小心任何模式元字符/等。 在模式中。