首页 > 解决方案 > 如何根据特定列字段中出现 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

请你帮助我好吗?谢谢你们

标签: bashtext-processing

解决方案


以下将执行要求的操作

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 行,将找不到下一个匹配项。模式应该根据真正需要而改变。


推荐阅读