首页 > 解决方案 > 使用范围表达式过滤表格文件

问题描述

这是一个示例文件。我想打印由两个 shell 变量定义的范围内第 2 列中的数字所在的行。

Test    198     A   0   
Test    199     A   2   
Test    2       A   0
Test    202     A   22  
Test    122859  G   199
Test    198589  A   0   

例如,如果 $start=198 和 $end=202,我只想要这些行:

Test    198 A   0   
Test    199 A   2   
Test    202 A   22  

不是

Test    122859      G   **199**
Test    **198**589  A   0   

我尝试了 awk 和 sed 的几种组合,但没有找到在我的脚本中正常工作的组合。

sed -n -e "/\t$start\t/,/\t$end\t/p" file 这是我最初的尝试,除了在这种情况下工作得很好

Test    122859      G   **199**

所以我尝试了 awk 并没有成功,尤其是处理这种情况:

Test    **198**589  A   0   

awk '$2 == "$start", $2 == "$end"' file或者awk "$2 ~ /\t$start\t/,/\t$end\t/" file

有没有办法纠正其中一个以使其满足我的需要?

谢谢

标签: awksed

解决方案


看起来您正在尝试选择文件中的范围,但您实际上是在单个字段中选择范围。

尝试

start=198
end=202
awk -v start="$start" -v end="$end" '$2>=start && $2<=end' file

首先,您定义变量以简化其在awk代码中的使用。然后你只需要告诉awk选择第二个字段大于或等于 your$start并且小于或等于 your的所有行$end


推荐阅读