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不断变化请帮助..
您正在使用错误的方法将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手册
Run Code Online (Sandbox Code Playgroud)-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" '$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)