在awk中使用两个变量,根据字段值选择行

在awk中使用两个变量,根据字段值选择行,awk,Awk,我有一个文件sample.bedgraph,其中的线条如下所示: 8 43825627 43825628 1313 X 1753769 1753780 14 我想去掉任何字段4小于10且大于150的行-过滤后的文件应该只有第2行。我知道我可以简单地做到: awk '$4 >= 10 && $4 <= 150' sample.bedgraph > sample.filtered.bedgraph 但是,我的10和150阈值来自某个上游管道命

我有一个文件sample.bedgraph,其中的线条如下所示:

8   43825627    43825628    1313
X   1753769 1753780 14
我想去掉任何字段4小于10且大于150的行-过滤后的文件应该只有第2行。我知道我可以简单地做到:

awk '$4 >= 10 && $4 <= 150' sample.bedgraph > sample.filtered.bedgraph
但是,我的10和150阈值来自某个上游管道命令,我需要将它们称为$Min和$Max,因此如果我这样做:

awk '$4 >= $Min && $4 <= $Max' sample.bedgraph > sample.filtered.bedgraph
它没有任何回报。如果我在变量$Min和$Max中添加' 不会过滤掉任何线路。如果我只比较最小值或最大值,它就不起作用。我查看了一些其他帖子,人们建议使用-v,但我也没有运气


任何建议都将不胜感激。谢谢。

假设您有如下shell变量

$ Min=10
$ Max=150
在awk中,您可以像下面这样使用,如果记录/行/行中的第4个字段介于10和150之间,则将打印此类记录

$ awk -v min="$Min" -v max="$Max" '$4 >= min && $4 <= max' sample.bedgraph > sample.filtered.bedgraph
测试结果:

$ cat infile
8   43825627    43825628    1313
X   1753769 1753780 14

$ awk '$4 < 10 || $4 >150 {next}1' infile
X   1753769 1753780 14

假设你有shell变量,比如

$ Min=10
$ Max=150
在awk中,您可以像下面这样使用,如果记录/行/行中的第4个字段介于10和150之间,则将打印此类记录

$ awk -v min="$Min" -v max="$Max" '$4 >= min && $4 <= max' sample.bedgraph > sample.filtered.bedgraph
测试结果:

$ cat infile
8   43825627    43825628    1313
X   1753769 1753780 14

$ awk '$4 < 10 || $4 >150 {next}1' infile
X   1753769 1753780 14
与上面所说的差不多,但是您可以对awk使用双引号,并让shell扩展$Vars。它在找麻烦,洛萨逃跑了,但事情是这样的:

$ awk "\$4 >= $Min && \$4 <= $Max" file
X   1753769 1753780 14
与上面所说的差不多,但是您可以对awk使用双引号,并让shell扩展$Vars。它在找麻烦,洛萨逃跑了,但事情是这样的:

$ awk "\$4 >= $Min && \$4 <= $Max" file
X   1753769 1753780 14

非常感谢您的回复。你能解释一下{next}吗?如果field4小于10或大于150,我们就不打印记录了。“下一行”表示转到下一行/记录。1结尾是{print$0}非常感谢您的回复。你能解释一下{next}吗?如果field4小于10或大于150,我们就不打印记录了。“下一行”表示转到下一行/记录。最后的1只不过是{print$0}谢谢。你凭什么说这会有麻烦?你会推荐-v吗?是的,我会推荐。使用-v方法可以避免转义每个$和其他一些字符的麻烦,并使代码更具可读性。谢谢。你凭什么说这会有麻烦?你会推荐-v吗?是的,我会推荐。使用-v方法可以避免转义每个$和其他一些字符的麻烦,并使代码更具可读性。