我想知道如何将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分等开头的行。
答案 0 :(得分:3)
在regexp文字(/.../
)中不会扩展变量。您需要使用~
运算符和字符串文字。
awk -v pattern="$y" '$0 ~ "^"pattern {print $2}' "$x" > "freec_${x}_${y}_st.txt"
您还需要注意任何模式元字符/等。在模式中。