unix awk列等于变量

onc*_*nce 2 unix variables bash awk while-loop

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

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
Run Code Online (Sandbox Code Playgroud)

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

a="2607s1"; b="84.2"
Run Code Online (Sandbox Code Playgroud)

并使用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
Run Code Online (Sandbox Code Playgroud)

我尝试了以下但不工作:

awk -v '$1==$a' && '$10==$b' test_file
cat test_file|awk '$1=="($a)" && $10=="($b)"'
cat test_file|awk '$1==($a) && $10==($b)'
cat test_file|awk '$1=="$a" && $10=="$b"'
Run Code Online (Sandbox Code Playgroud)

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

nu1*_*73R 6

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

awk -v a="$a" -v b="$b" '$1==a && $10 == b' 
Run Code Online (Sandbox Code Playgroud)

它能做什么

  • -v a="$a"创建一个awk变量a并为其分配shell变量的值$a.

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

要么

awk '$1==a && $10 == b' a="$a" b="$b" file
Run Code Online (Sandbox Code Playgroud)

当你写这样的声明

awk -v '$1==$a' && '$10==$b' test_file
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)


测试

$ 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" '$1==a && $10 == 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
Run Code Online (Sandbox Code Playgroud)