将小数字传入awk里面的shell不工作

ola*_*ala 1 bash shell awk

我想编写一个包含较小数字的包装脚本,比如1e-3,并将其用作截止值来选择某些数据行.

假设我有一个input.txt

region  p-value
brain   0.009
breast  0.001
liver   1e-7
skin    1e-6
Run Code Online (Sandbox Code Playgroud)

我想从我的玩具示例中选择p值小于1e-5的区域,这些区域是肝脏和皮肤.

我的脚本目前看起来像select.sh

#!/bin/bash
file=$1
column=$2
cutoff=$3

awk -v a="$column" -v b="$cutoff" '{ if (a < b) print}' $file > $file'.'$cutoff
Run Code Online (Sandbox Code Playgroud)

我会像这样跑:

bash select.sh input.txt 2 1e-5
Run Code Online (Sandbox Code Playgroud)

这不起作用......但是,如果我直接在终端上输入awk行,它就可以了.

 awk '{if ($2 < 1e-5) print}' input.txt > input.1e-5
Run Code Online (Sandbox Code Playgroud)

所以我知道这可能是关于shell环境中的awk我不知道的事情.有谁知道如何解决它?

更新:我试图将0.00001传递给命令,它也不起作用.

谢谢!

fed*_*qui 5

$在调用中缺少if (a<b):如果你想参考列号a,你必须说$a.

做就是了:

awk -v a="$column" -v b="$cutoff" '{ if ($a < b) print}' $file > $file'.'$cutoff
                                         ^
Run Code Online (Sandbox Code Playgroud)

甚至更短:

awk -v a="$column" -v b="$cutoff" '$a < b' "$file" > "$file.$cutoff"
                                                     ^^^^^^^^^^^^^^^
                                    Charles Duffy's security check
Run Code Online (Sandbox Code Playgroud)

  • 因为`$ a`指的是字段编号`a`,而`b`是我们比较该值的变量.那就是:awk的列名为`$ 1`,`$ 2`,...,而awk的变量没有前导`$`. (2认同)