我有一个文件(sample.bedgraph),其行如下:
8 43825627 43825628 1313
X 1753769 1753780 14
我想摆脱任何字段4小于10且大于150的行 - 过滤后的文件应该只有第二行。我知道我可以做到:
awk '$4 >= 10 && $4 <= 150' sample.bedgraph > sample.filtered.bedgraph
然而,我的10和150阈值来自某些上游管道命令,我需要将它们称为$ Min和$ Max,所以如果我这样做:
awk '$4 >= $Min && $4 <= $Max' sample.bedgraph > sample.filtered.bedgraph
根本没有回报。如果我添加&#34;&#39;&#34;我的变量($ Min和$ Max),它 不会过滤掉任何一条线。如果我只与最小值或最大值进行比较,则不起作用。我查了一些其他帖子,人们建议&#34; -v&#34;,但我也没有运气。
任何建议表示赞赏。谢谢。
答案 0 :(得分:3)
假设你有像
这样的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
我想摆脱任何字段4小于10的行 大于150 - 过滤后的文件应该只有第二行。一世 我知道我可以做到:
使用AND
不能同时使用小于10且大于150的字段4,因此您可以使用下面的OR
:
awk '$4 < 10 || $4 >150 {next}1' infile
测试结果:
$ cat infile
8 43825627 43825628 1313
X 1753769 1753780 14
$ awk '$4 < 10 || $4 >150 {next}1' infile
X 1753769 1753780 14
答案 1 :(得分:2)
几乎是@3161993所说的,但你可以使用双引号("
)作为awk,让shell展开$Var
。它正在寻找麻烦(许多逃避),但在这里:
$ awk "\$4 >= $Min && \$4 <= $Max" file
X 1753769 1753780 14