AWK 文件中的嵌入范围

AWK 文件中的嵌入范围

当作为 CLI 传递时,我发现了大量 AWK Ranges 示例。例如:

awk '/start/,/end/' file

如何在 AWK 文件中嵌入范围?

#!/usr/bin/awk -f

BEGIN{
}
{
   # how do I express those "start" and "end" ranges?
}
END {
}

我的文本文件看起来像这样:

...
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...

答案1

awk 脚本的主体具有以下形式:

*pattern* *action*

其中任何一个都可以省略。省略图案意味着行动总是被执行。省略行动默认打印当前行。

表达范围的自然方式是图案部分,像这样:

BEGIN {
  somevar=5
}

/start/,/end/ { print }

END {
  somevar=6
}

(我留在 BEGIN 和 END 部分,只是为了保持与开始时相同的结构)。

要在行动部分需要跟踪您所在的位置:

BEGIN {
  p=0
}

{
  if (/start/) p=1
  if (p) { print }
  if (/end/) p=0
}

END {
  p=0
}

在这里,没有图案, 所以行动块针对每一行执行。一旦我们看到匹配/p的行,我们就将标志 ( ) 设置为 1 或“true”;/start如果(且仅当)该标志为真,我们打印该行。如果我们看到/end/,则重置标志。 BEGIN 和 END 块在这里是多余的; awk 中的变量默认为零/假。

答案2

oot@localhost ~]# i=`awk '/care/{print NR}' l.txt| sort -nr| sed -n '1p'`
[root@localhost ~]# awk -v i="$i"  '/care/{x=NR+i}(NR<=x){print }' l.txt
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...

相关内容