python - 匹配 AWK 中多行的正则表达式。 && 运算符(operator)?

标签 python regex parsing awk

我不确定 && 运算符是否适用于正则表达式。我想要做的是匹配一行,使其以数字开头并具有字母“a”,下一行以数字开头并具有字母“b”,下一行......字母“c” .此 abc 序列将用作开始读取文件的唯一标识符。

这就是我在 awk 中的目标。

/(^[0-9]+ .*a)&&\n(^[0-9]+ .*b)&&\n(^[0-9]+ .*c) {
print $0
}

这些正则表达式中的一个就像 (^[0-9]+ .*a),但我不确定如何将它们串在一起,下一行是这样的。

我的文件是这样的:

JUNK UP HERE NOT STARTING WITH NUMBER
1     a           0.110     0.069          
2     a           0.062     0.088          
3     a           0.062     0.121          
4     b           0.062     0.121          
5     c           0.032     0.100         
6     d           0.032     0.100          
7     e           0.032     0.100   

我想要的是:

3     a           0.062     0.121          
4     b           0.062     0.121          
5     c           0.032     0.100         
6     d           0.032     0.100          
7     e           0.032     0.100 

最佳答案

[根据澄清更新。]

一个高阶位是 Awk 是一种面向行的语言,因此您实际上无法进行正常的模式匹配来跨行。执行此类操作的通常方法是分别匹配每一行,并在后面的子句/语句中确定是否匹配了所有正确的部分。

我在这里做的是在一行的第二个字段中寻找 a,在另一行的第二个字段中寻找 b,在另一行中寻找 >c 在第三行的第二个字段中。在前两种情况下,我隐藏了行的内容以及它出现的行号。当第三行匹配但我们还没有找到整个序列时,我返回并检查其他两行是否存在以及是否具有可接受的行号。如果一切顺利,我会打印出缓冲的前几行并设置一个标志,指示应打印其他所有内容。

这是脚本:

$2 == "a" { a = $0; aLine = NR; }
$2 == "b" { b = $0; bLine = NR; }
$2 == "c" && !keepPrinting {
    if ((bLine == (NR - 1)) && (aLine == (NR - 2))) {
        print a;
        print b;
        keepPrinting = 1;
    }
}
keepPrinting { print; }

这是我测试过的文件:

JUNK UP HERE NOT STARTING WITH NUMBER
1     a           0.110     0.069
2     a           0.062     0.088
3     a           0.062     0.121
4     b           0.062     0.121
5     c           0.032     0.100
6     d           0.032     0.100
7     e           0.032     0.100
8     a           0.099     0.121
9     b           0.098     0.121
10    c           0.097     0.100
11    x           0.000     0.200

这是我运行时得到的结果:

$ awk -f blort.awk blort.txt
3     a           0.062     0.121
4     b           0.062     0.121
5     c           0.032     0.100
6     d           0.032     0.100
7     e           0.032     0.100
8     a           0.099     0.121
9     b           0.098     0.121
10    c           0.097     0.100
11    x           0.000     0.200

关于python - 匹配 AWK 中多行的正则表达式。 && 运算符(operator)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12718429/

相关文章:

python - 在 Tensorflow 中使用您自己的数据

javascript - 是否存在与 Python 的 for 循环等效的 JavaScript?

python - 将简单的 python "program"转换为 C "program"!

javascript - javascript 中的正则表达式验证在 IE8 中失败

java - Spring 请求映射与正则表达式如 javax.ws.rs

C#/.NET 词法分析器生成器

python - 有没有办法在 voltdb python 驱动程序(voltdb-client-python)中运行原始 SQL?

javascript - 正则表达式检查是否存在空格?

c++ - 解析为具有默认值的结构

c++ - 如何使用Boost解析ini文件