bash - 如何根据特定列字段中出现 PATTERN 的连续次数来选择行?
问题描述
我陷入了一个非常简单的问题。我希望你能帮助我我有一个看起来像这样的大文件:
32 Q beta
33 S beta
34 A nb
35 T nb
36 G nb
37 T nb
38 K nb
39 T nb
40 D nb
41 T beta
42 P beta
43 I nb
44 Q nb
45 K nb
46 V nb
50 I beta
51 S beta
52 V beta
53 V beta
54 T beta
它总是以 $3="beta" 的行开头。我想只保存第 3 列中包含特定次数(<=5)模式“非 beta”的行,并只复制第 3 列等于“beta”的前/后行(尽管这些行的数量)。
所以输出将是:
41 T beta
42 P beta
43 I nb
44 Q nb
45 K nb
46 V nb
50 I beta
51 S beta
52 V beta
53 V beta
54 T beta
请你帮助我好吗?谢谢你们
解决方案
以下将执行要求的操作
grep -zPo '(^|\n)(\S+\s\S+\sbeta\n)+(\S+\s\S+\s(?!beta).*\n){1,4}(\S+\s\S+\sbeta\n)+' file.txt | tr '\0' '\n'
但是,可能不会完全符合您的预期:当许多 (<=5) 模式非 beta 被 beta 行分隔时,由于已经消耗了 beta 行,将找不到下一个匹配项。模式应该根据真正需要而改变。
推荐阅读
- docker - 从 docker 镜像中获取 docker 容器 ID/名称并重命名该容器
- math - x^k 在 (1+x)(1+x^2)(1+x^3)(1+x^4)....(1+x^n) 中的系数是多少
- java - Log4j2 滚动文件附加程序正在重写日志文件
- python - 使用 argparse 在控制台中运行脚本时出错
- ansible - 如何使用用户提示跳过播放?
- javascript - beforeunload 替代 iPhone 和 iPad
- python - Windows:[WinError 126] 找不到指定的模块
- sql - SQL:LEFT JOIN 基于另一个表的生效日期
- python - python中有.=运算符吗?如果没有,我该怎么做?
- javascript - 使用正确的编码从 REST API 下载 pdf