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

时间:2017-10-25 18:46:16

标签: awk

我有一个文件(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;,但我也没有运气。

任何建议表示赞赏。谢谢。

2 个答案:

答案 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