将bash变量作为模式传递给awk

时间:2014-11-18 18:53:23

标签: linux bash shell awk

我想知道如何将bash variable作为pattern传递给awk。 我已经阅读了几个Q / As,它们倾向于回答相同的问题,然而,它们都没有解决我的问题(可能,我错过了一些东西!)。

我有几个这样的文件:

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

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

我的代码如下所示:

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

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

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

我没有收到任何错误,所有文件都已创建;但是,它们都是空的!任何建议都非常感谢!

[修改] 我使用grep找到了一种更简洁的方式(以前,我认为grep无法完成!):

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

使用grep很有帮助,因为通过使用\s,我可以区分以2分,21分和22分等开头的行。

1 个答案:

答案 0 :(得分:3)

在regexp文字(/.../)中不会扩展变量。您需要使用~运算符和字符串文字。

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

您还需要注意任何模式元字符/等。在模式中。