我不确定 && 运算符是否适用于正则表达式。我想要做的是匹配一行,使其以数字开头并具有字母“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/