从具有特定正则表达式的巨大重复文件中提取特定行

时间:2014-11-19 08:56:21

标签: regex linux awk

我有一个这种格式的大文件:

Sequence

xxxxx 12  161
xxxxx 54  148
Sequence

hhhhh 4   110
gsgsgs 8   88
Sequence

jjjjj 1   45
skskkak 5  8

依旧...... 我只想要一个带有“序列”之后的第一个完整行的文件(请注意,在该单词后面有一个空格)。那就是:

xxxxx 12  161
hhhhh 4   110
jjjjj 1   45

请帮忙吗?我想用awk做的,但我不经常使用,所以我有点迷失正则表达式...

4 个答案:

答案 0 :(得分:1)

Sed 解决方案就像

$ sed -n '/Sequence/{n;n;p}' test
xxxxx 12  161
hhhhh 4   110
jjjjj 1   45

如果您想要 awk ,可以尝试

$ awk '/Sequence/{getline; getline; print}' test
xxxxx 12  161
hhhhh 4   110
jjjjj 1   45

短得多

awk '/Sequence/{x=NR+2}NR==x'

感谢Jidder的建议

答案 1 :(得分:1)

您可以使用'^(?=Sequence).*\n+^$\n+\K(^.*$)'模式来匹配这些文字。

$ grep -Pzo '^(?=Sequence).*\n+^$\n+\K(^.*$)' file.txt 
xxxxx 12  161
hhhhh 4   110
jjjjj 1   45

此处\K导致前面的模式匹配而不打印它。

您可以实时查看here

答案 2 :(得分:0)

您可以在awk

中将变量用作标记
awk '/Sequence/{f=1;next}f==1&&NF>0{f=0;print}'
    在与/Sequence/{f=1;next}设置标记/Sequence/相匹配的行上
  • f并跳到下一行
  • 第一个非空行未设置标记f==1&&NR>0{f=0;print}上的
  • f并打印行

答案 3 :(得分:-1)

sequence\s*([a-zA-Z0-9 ]+)

您可以使用grep -P尝试此操作。请参阅demo.grab捕获。

http://regex101.com/r/lZ5mN8/30