Awk 如何在上次匹配后打印第6行到第10行?

Awk 如何在上次匹配后打印第6行到第10行?,awk,sed,grep,Awk,Sed,Grep,匹配最后一行后,我想打印第6到第10行: 这就是我尝试过的: awk '/Constrained/ { print ; for(n=6; n<10; n++) { getline ; print } }' filename 我应该得到以O开头,以Ti结尾的行。但是在整个文件中有几个约束的我能想到的最简单的方法是读取两次文件。第一个过程找到匹配的最后一个行号,第二个过程在它之后打印6-10 awk 'FNR==NR && /Constrained/ { line=NR }

匹配最后一行后,我想打印第6到第10行:

这就是我尝试过的:

awk '/Constrained/ { print ; for(n=6; n<10; n++) { getline ; print } }' filename

我应该得到以O开头,以Ti结尾的行。但是在整个文件中有几个约束的

我能想到的最简单的方法是读取两次文件。第一个过程找到匹配的最后一个行号,第二个过程在它之后打印6-10

awk 'FNR==NR && /Constrained/ { line=NR }
     FNR!=NR && FNR >= line+6 && FNR <= line+10' filename filename

我能想到的最简单的方法就是把文件读两遍。第一个过程找到匹配的最后一个行号,第二个过程在它之后打印6-10

awk 'FNR==NR && /Constrained/ { line=NR }
     FNR!=NR && FNR >= line+6 && FNR <= line+10' filename filename

一个选项:反转文件,找到第一个匹配项加上10行,重新反转,取最后5行:

tac filename | grep -B10 Constrained -m 1 | tac | tail -n 5

一个选项:反转文件,找到第一个匹配项加上10行,重新反转,取最后5行:

tac filename | grep -B10 Constrained -m 1 | tac | tail -n 5
tac反转文件,因此您可以使用grep-m1轻松找到最后一个匹配项。第二,您希望在“before”之前处理10行,其中5行要跳过,5行要打印,因为输出是反向的。第二个tac再次反转输出,以便获得原始行顺序,tail-n5将隐藏受约束和6之间的行。匹配后要打印的行

当然,您可以用一个简单的grep来实现这一点,但是这将读取和处理整个文件,并且速度可能会明显减慢。tac从文件末尾开始读取

grep -A10 "Constrained" file | tail -n5
在awk同时读取整个文件的情况下:

awk '/Constrained/{f=NR;b=""};NR>=f+6 && NR<=f+10{b=b ORS $0}END{print b}' file
搜索约束,将初始行号f设置为当前行,并删除先前结果的缓冲区。然后将线收集到b中,只要线号与区域匹配

tac反转文件,因此您可以使用grep-m1轻松找到最后一个匹配项。第二,您希望在“before”之前处理10行,其中5行要跳过,5行要打印,因为输出是反向的。第二个tac再次反转输出,以便获得原始行顺序,tail-n5将隐藏受约束和6之间的行。匹配后要打印的行

当然,您可以用一个简单的grep来实现这一点,但是这将读取和处理整个文件,并且速度可能会明显减慢。tac从文件末尾开始读取

grep -A10 "Constrained" file | tail -n5
在awk同时读取整个文件的情况下:

awk '/Constrained/{f=NR;b=""};NR>=f+6 && NR<=f+10{b=b ORS $0}END{print b}' file

搜索约束,将初始行号f设置为当前行,并删除先前结果的缓冲区。然后,只要行号与区域匹配,就将行收集到b中。

一次读取文件,但跟踪缓冲区:

awk '(c-->0){b[10-c]=$0}
     /Constrained/{c=10}
     END{for(i=6;i<=10;++i) print b[i] }' file
参数化版本:

参数化版本将允许较大的范围。但想象一下,比赛结束后,你想要10000到10001条线。所以缓冲区会非常大,只有两行。因此,我们可以将其更正为:

$ awk '(c-->min) && (c<=max-min){b[max-c]=$0}
       ($0~ere){c=max; delete b}
       END{for(i=min;i<=max;++i) if (i in b) print b[i] }' \
       min=6 max=10 ere="Constrained" file

一次读取文件,但跟踪缓冲区:

awk '(c-->0){b[10-c]=$0}
     /Constrained/{c=10}
     END{for(i=6;i<=10;++i) print b[i] }' file
参数化版本:

参数化版本将允许较大的范围。但想象一下,比赛结束后,你想要10000到10001条线。所以缓冲区会非常大,只有两行。因此,我们可以将其更正为:

$ awk '(c-->min) && (c<=max-min){b[max-c]=$0}
       ($0~ere){c=max; delete b}
       END{for(i=min;i<=max;++i) if (i in b) print b[i] }' \
       min=6 max=10 ere="Constrained" file
您所需要的只是:

grep -A10 Constrained file | tail -n 5
您所需要的只是:

grep -A10 Constrained file | tail -n 5

我建议试试这个。 -A表示单词匹配后的10行。 -m表示何时停止读取文件。我们不想读整个文件。你知道吗

grep -A10 Constrained file | tail -5

我建议试试这个。 -A表示单词匹配后的10行。 -m表示何时停止读取文件。我们不想读整个文件。你知道吗

grep -A10 Constrained file | tail -5


使用sed-n'6,10p'文件名在第6行和第10行之间打印included@Zelnes这将打印文件的第6行到第10行,而不是在匹配之后。您是只想匹配文件中的最后一个约束行,还是说在每次匹配之后?我只想匹配最后一个约束行,这非常困难,因为在到达文件末尾之前,您不知道它是否是最后一个匹配项。请使用sed-n'6,10p'文件名,在第6行和第10行之间打印included@Zelnes这将打印文件的第6行到第10行,而不是在匹配之后。是否只匹配文件中最后一个受约束的行,或者你的意思是每场比赛之后?我只想匹配最后一场比赛,这要难得多,因为在你到达文件末尾之前,你不知道这是否是最后一场比赛。我猜OP想匹配最后一场Constrained@anubhava可能的last match可能表示文件中的最后一个匹配,也可能表示最近的匹配。我指的是文件中的最后一个匹配这也在打印匹配。我真的不想要那条线,那你为什么要打印;在for循环之前?我想OP想最后一个匹配Constrained@anubhava可能的last match可能表示文件中的最后一个匹配,也可能表示最近的匹配。我指的是文件中的最后一个匹配这也在打印匹配。我真的不想要那条线,那你为什么要打印;在for循环之前,-m1标志做什么?@Caterina-type-man-grep在你的终端或谷歌grep手册页中。-m1标志做什么?@Caterina-type-man-grep在你的终端或谷歌grep手册页中。@Caterina-naah,与被接受的答案相同,但是

有了更多的解释,我花了3分钟来写:-P我应该停止写解释。不,你不应该;-解释更有用。这个答案几乎是正确的,但我不明白最后一行Ti@Caterina请参阅更新。我还添加了一些东西来考虑GRPY尾巴和Tac GeRp Tac尾巴,以防万一,我赞成你的答案:但是我选择了另一个,因为它是simpler@Caterina娜哈,答案与被接受的答案相同,但更多的解释花了3分钟来写:-P我应该停止写解释。不,你不应该;-解释更有用。这个答案几乎是正确的,但我不明白最后一行Ti@Caterina请参阅更新。我还添加了一些东西来考虑GRPY-TROW和TAC.GRIPTAC.TAY尾。以防万一,我赞成你的答案:但是我选择了另一个,因为这是简单的,她确实需要读取整个文件,否则她就不知道最后一个约束发生在哪里。您发布的内容将打印第一个约束块的最后5行,这是一个比问题所涉及的问题简单得多的问题。明白了。我没有正确回答这个问题-m1不应该出现现在你的答案与我在你回答之前发布的答案相同。当我更新查询时,我注意到你已经回答了。对你很好。我期待更多的答案。哦,我没有注意到,我会删除我的重复答案,但好的。是的,她确实需要阅读整个文件,否则她将不知道最后一个约束发生在哪里。您发布的内容将打印第一个约束块的最后5行,这是一个比问题所涉及的问题简单得多的问题。明白了。我没有正确回答这个问题-m1不应该出现现在你的答案与我在你回答之前发布的答案相同。当我更新查询时,我注意到你已经回答了。对你很好。我期待更多的答案。哦,我没有注意到,我会删除我的重复答案,但好的。Ed你一点都不有趣;-看到我们中的大多数人在尽可能简单的情况下是多么的沉默寡言,真是太棒了-我要说的是,如果最后一个约束后没有10行,这将失败。是的,这是一个解决方案,只做OP在后面的问题中提到的,我应该得到以O开头,以Ti结尾的行。会更稳健,但我假设OP会让我们知道任何需要考虑的雨天案例。事实上,这总是让我想到这个问题。使用awk,您基本上可以完成与sed、grep、cat、ack、tr、uniq等相关的所有工作。但何时应该推荐管道?它们通常更具可读性。这是艺术而不是科学,但当结果比awk脚本更清晰、更简单时,我倾向于使用管道或单独的其他命令,并且我不希望将来必须扩展代码,这不是我想在awk中仅仅为了学习体验而做的事情。如果你获得了使用awk处理大多数相对简单但仍然合适且不琐碎的现有工具的经验,在你并不真正需要它的地方,你会发现使用awk处理复杂的东西要容易得多。Ed你一点也不有趣;-看到我们中的大多数人在尽可能简单的情况下是多么的沉默寡言,真是太棒了-我要说的是,如果最后一个约束后没有10行,这将失败。是的,这是一个解决方案,只做OP在后面的问题中提到的,我应该得到以O开头,以Ti结尾的行。会更稳健,但我假设OP会让我们知道任何需要考虑的雨天案例。事实上,这总是让我想到这个问题。使用awk,您基本上可以完成与sed、grep、cat、ack、tr、uniq等相关的所有工作。但何时应该推荐管道?它们通常更具可读性。这是艺术而不是科学,但当结果比awk脚本更清晰、更简单时,我倾向于使用管道或单独的其他命令,并且我不希望将来必须扩展代码,这不是我想在awk中仅仅为了学习体验而做的事情。如果您在使用awk处理大多数相对简单但仍然合适且不琐碎的现有工具时获得了经验,您会发现在您不真正需要它的地方,使用awk处理复杂的东西会容易得多。