unix awk 列等于一个变量

unix awk column equal to a variable

我想打印两列等于一个变量的行,例如,输入:

2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2
2607s1  NC_000067.6 97.67   43  1   0   8   50  1e-13   75.0

第一列和最后一列的变量:

a="2607s1"; b="84.2"

并使用 awk 命令,输出:

2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2

我尝试了以下方法但没有用:

awk -v '==$a' && '==$b' test_file
cat test_file|awk '=="($a)" && =="($b)"'
cat test_file|awk '==($a) && ==($b)'
cat test_file|awk '=="$a" && =="$b"'

此外,我运行它在一个while循环中,所以$a$b不断变化请帮助..

您可以尝试以下 awk 命令。

awk -v var1="$a" -v var2="$b" '==var1&&$NF==var2' file

您正在使用错误的方法将 shell 变量传递给 awk 命令。应该是

awk -v a="$a" -v b="$b" '==a &&  == b' 

它的作用

  • -v a="$a" 创建一个 awk 变量 a 并将 shell 变量 $a 的值赋给它。

  • -v b="$b" 创建 awk 变量 b.

awk '==a &&  == b' a="$a" b="$b" file

当你写这样的语句时

awk -v '==$a' && '==$b' test_file

awk 不知道 $a $b 是什么,因为两者都是 shell 变量。

并且使用 -v 传递 shell 变量的正确方法如示例中所示。

来自 awk 手册

-v var=val

   --assign var=val

    Assign  the  value  val to the variable var, before execution of
    the program begins.  Such variable values are available  to  the
    BEGIN block of an AWK program.


测试

$ cat file 
2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2
2607s1  NC_000067.6 97.67   43  1   0   8   50  1e-13   75.0

$ a="2607s1"; b="84.2"

$ awk -v a="$a" -v b="$b" '==a &&  == b' file 
2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2

你也可以这样做(这样可以避免使用 -v 参数)

awk '=="'$a'" && =="'$b'"' file

$a 之前的引号 ' 将关闭字符串解释。

$a 之后的引号 ' 将打开字符串解释。

$a 以这种方式解释并替换为它的值。