awk 如果找到模式则跳过 n 行

awk 如果找到模式则跳过 n 行

skip N lines当在 awk 中发现模式时该怎么做?

awk '{if ($0~/pattern/) skip N lines; else print $0}'

答案1

让我向你展示如何让这个 awk 解决方案更加符合地道(请参阅awk 信息页面在 stackoverflow 上)。

从...开始:

$ seq 10 20 | awk '{if ($0 ~ /11/) {n=NR+6}; if (NR<n) next; print $0}'
10
17
18
19
20

首先,我们将if语句转换condition {action}成行

awk '
    $0 ~ /11/ {n=NR+6}
    NR < n {next}
    {print $0}
'

然后,我们将使用$0某些内容的默认值:

awk '
    /11/ {n=NR+6}
    NR < n {next}
    {print}
'

{print}然后,如果条件为真,我们将采取默认操作

awk '
    /11/ {n=NR+6}
    NR < n {next}
    1
'

然后,我们将反转NR < n条件以删除next

awk '
    /11/ {n=NR+6}
    NR >= n
'

我们可以用一行代码来实现它:

awk '/11/ {n=NR+6} NR >= n'

这会产生相同的输出

$ seq 10 20 | awk '/11/ {n=NR+6} NR >= n'
10
17
18
19
20

比较:

awk '{if ($0 ~ /11/) {n=NR+6}; if (NR<n) next; print $0}'
awk '/11/ {n=NR+6} NR >= n'

最后一步,您可能希望将模式和 N 的值作为参数传递给 awk,这样就不必对它们进行硬编码。这会增加 awk 调用量,但对您来说可能更灵活:

awk -v patt="11" -v N=6 '$0 ~ patt {n = NR + N} NR >= n'

通过将参数放在 awk 脚本之后,-v可以删除它,从而使命令更短一些:

awk '$0 ~ patt {n = NR + N} NR >= n' patt=11 N=6

将变量放在 awk 主体之后的一个优点是它们可以为每个文件获取不同的值:

awk '$0 ~ patt {n = NR + N} NR >= n' patt=11 N=6 file1 N=10 file2

答案2

= 要跳过的行数

awk '{if ($0~/pattern/) {n=NR+N;} if (NR<n) next; print $0;}'

相关内容