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;}'