【问题标题】:awk: Print lines starting with a pattern only if the next line also starts with the same patternawk:仅当下一行也以相同的模式开始时才打印以模式开头的行
【发布时间】:2016-09-01 23:24:15
【问题描述】:

我读了一篇类似的帖子,标题为“仅当下一行与模式不匹配时打印匹配模式的行”,其中提到的解决方案是

awk 'a=/^O/{x=$0} !a&&x{print x;x=0;}' myfile

我只是想知道如果我想打印文件中的所有行,其下一行也以与当前行相同的模式开始。

例如

文件文本包含:

abc this is a line
def
abc this is line 2
ghi
abc this is line 3
abc this is line 4
jkl
mno
abc this is line 5
jkl
abc this is line 6
abc this is line 9
jkl

该命令应该只打印以下行:

abc this is line 3
abc this is line 6

任何帮助将不胜感激。

感谢所有帮助过的人。在此处稍微编辑原始问题以满足要求,因为当有多个类似的行时,以下内容将无济于事。

如果文件中的所有行都以不同的模式结束,那么 awk 命令是什么。

例如:如果文件包含:

Student name is A
Student name is B
Student name is C
result for C is pass
Student name is D
result for D is pass
Student name is E
result for E is pass
Student name is F
result for F is pass
Student name is G
result for G is pass
Student name is H
Student name is I
result for I is pass

如何使用 awk 打印学生未通过的所有带有学生姓名的行。 所以对于上面的例子,打印的行应该是:

Student name is A
Student name is B
Student name is H

我是否可以使用 awk 打印所有以 Student 开头且下一行不以字符串 PASS 结尾的行?

【问题讨论】:

  • 如果连续 3 行或更多行以这种模式开头会怎样?
  • 你在考虑这个倒退。如果您要翻牌并且翻出 K,那么根据您的下一张牌是否会是 A,此时很难做某事,因为您还没有看到下一张牌。另一方面,如果你翻出一张 A,如果你之前的牌是一张 K,那么做某事是非常容易的,因为你已经看过了。相同顺序的 2 张卡片,但以不同的方式思考它向您展示了一个艰难的解决方案和一个简单的解决方案。如果您可以根据之前发生的事情来做事,请避免尝试根据接下来发生的事情来做事情。

标签: awk


【解决方案1】:

编辑

对于更新的要求:

我是否可以使用 awk 打印所有以 Student 开头且下一行不以字符串 PASS 结尾的行?

$ awk '$NF != "pass" && p0 {print p0} {p0 = ($1 == "Student") ? $0 : ""}' sw.txt
Student name is A
Student name is B
Student name is H

上一个

打印文件中下一行也以与当前行相同的模式开始的所有行。

$ awk '$1 == p1 {print p0} {p1 = $1; p0 = $0}' sw.txt
abc this is line 3
abc this is line 6

如果当前的第一个字段与前一行的匹配,我们打印前一行。

(我应该注意,虽然您的问题是指以相同“模式”开头的行,但根据示例输入和输出,我认为这意味着简单的字符串匹配,而不是与正则表达式作为“模式”有关通常在 awk 的上下文中指代。)

【讨论】:

  • 也许请注意,这不是模式匹配,而是文字匹配(相等)。问题也很模糊。
  • 如果输入文件的第一行是空白的或以数值计算为零的值开始,则无论第二行的值如何,这将打印一个初始空白行。 @codecrazy46 - 另外,请澄清您是否总是想要字符串或数字或正则表达式比较,因为现在您会发现某些值的字符串匹配和其他值的数字(所以0 == 0.00 等)。永远不要在软件需求中单独使用 pattern 这个词,因为它是模棱两可的 - 至少使用 stringregexp(或者在这种情况下是 numeric)并且如果你想要完全或部分匹配(abcde匹配abc?)
  • 感谢您的帮助。我在提到实际要求的原始问题中添加了几行。有没有我可以用于此目的的 awk one 班轮?
  • 鉴于新要求,请参阅编辑以获取可能的解决方案。
  • 感谢 jas 的帮助。现在效果很好。只是出于对此感兴趣,想问一下如果: 1. 第一行像 Student_name_is_A 一样连接,所以没有不同的单词,但第二行保持与编辑过的 question.2 中提到的相同格式。此外,如果第二行也没有不同的单词,但单词之间的分隔符是 _,如 result_for_I_is_pass,命令将如何变化?再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 2013-10-21
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
相关资源
最近更新 更多