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

标签 linux bash shell awk

我想知道如何将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/

相关文章:

c - linux函数获取挂载点

bash - 使用函数中止 bash 脚本

shell - 获取第 n 个工作日的 unix shell 脚本

android - 无法将 USB 模式下的 Moto E 连接到 Linux 系统

linux - 将 Shell 脚本 SQLite Select 语句的结果保存到变量

c++ - 无法使用带有 Linux 的 Qt 4.8 从 3Dconnexion SpaceNavigator 获取事件

linux - 如何使用另一个文件中已经存在的完成来扩展 bash-completion?

bash - 如何列出当前工作目录中的所有目录?

bash - 如何对 bash 中的文件列表执行多个命令(xargs?)

c++ - 如何从 C++ 程序运行另一个程序