awk - 使用范围表达式过滤表格文件
问题描述
这是一个示例文件。我想打印由两个 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
有没有办法纠正其中一个以使其满足我的需要?
谢谢
解决方案
看起来您正在尝试选择文件中的范围,但您实际上是在单个字段中选择范围。
尝试
start=198
end=202
awk -v start="$start" -v end="$end" '$2>=start && $2<=end' file
首先,您定义变量以简化其在awk
代码中的使用。然后你只需要告诉awk
选择第二个字段大于或等于 your$start
并且小于或等于 your的所有行$end
。
推荐阅读
- c++ - 在 C++ 中使用 std::cin 将 char 传递给 int
- reactjs - 在 Github.io 上看不到任何组件
- python - 针对用户登录绘制时间序列时出现问题?
- java - 如何使用viewpager一次获得一项垂直滚动
- vue.js - 无法将 CSS 加载到 Vue cli 项目中。Mimetype 始终为 html
- java - 如何在春季百里香中将值重新分配给全局定义的变量
- php - Codeigniter 会话数据或数据库查询?
- python - 如何将 LDAP AD 组映射到 python flask AppBuilder 中的用户角色
- c# - 触发集合中某个元素的 PropertyChanged
- javascript - rellax.js 无法指定区域吗?