我想知道如何将bash变量
作为模式
传递给awk
。
我读过几个问答,它们往往回答同一个问题,但是,它们都没有解决我的问题(可能,我错过了一些东西!)。
我有几个这样的文件:
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 等开头的行。
最佳答案
变量不会在正则表达式文字中扩展 (/.../
)。您需要使用 ~
运算符和字符串文字。
awk -v pattern="$y" '$0 ~ "^"pattern {print $2}' "$x" > "freec_${x}_${y}_st.txt"
您还需要小心任何模式元字符/等。在模式中。
关于linux - 将 bash 变量作为模式传递给 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27001788/