Loops 阵列循环转换

Loops 阵列循环转换,loops,awk,hp-ux,Loops,Awk,Hp Ux,在执行HP UX存储迁移项目时, 我发现一个awk语句如下 ioscan -funNCdisk | \ awk '{a[NR]=$0} $0~s {f[NR]++} END {for (j=1;j<=NR;j++) if (f[j]) for (i=j+C;i<=j+C;i++) \ print a[i]}' C=1 s="NetApp" ioscan-funNCdisk |\ awk'{a[NR]=$0}$0~s{f[NR]+}END{for(j=1;j让我们将awk脚本本身分解

在执行HP UX存储迁移项目时, 我发现一个
awk
语句如下

ioscan -funNCdisk | \
awk '{a[NR]=$0} $0~s {f[NR]++} END {for (j=1;j<=NR;j++) if (f[j]) for (i=j+C;i<=j+C;i++) \
print a[i]}' C=1 s="NetApp"
ioscan-funNCdisk |\

awk'{a[NR]=$0}$0~s{f[NR]+}END{for(j=1;j让我们将
awk
脚本本身分解成一个文件,并调用该文件
script.awk

#!/usr/bin/awk -f

BEGIN   { C = 1; s = "pants" }
        { a[NR] = $0 }
$0 ~ s  { f[NR]++ }
END     {
    for (j = 1; j <= NR; j++)
        if (f[j])
            for (i = j + C; i <= j + C; i++)
                print a[i]
}
因此,在您的情况下(这里用“NetApp”替换“裤子”),它实际上与(使用GNU
sed

个人提示:这就是我讨厌所谓的“一句话”的原因。它们很难看,没有人理解,而且完全无法维护。请,请,请,把复杂的任务放在脚本中,写得干净利落,加上注释,并将其用作你的“一句话”


EDIT:经过一番思考,我意识到这个脚本可能试图为
num=C
re=s
实现
grep-Cnum re
(获取
C
上下文行),但它在内部循环中得到了错误的循环索引(应该是
i=j-C;i让我们将
awk
脚本本身分解成一个文件,并将该文件称为
script.awk

#!/usr/bin/awk -f

BEGIN   { C = 1; s = "pants" }
        { a[NR] = $0 }
$0 ~ s  { f[NR]++ }
END     {
    for (j = 1; j <= NR; j++)
        if (f[j])
            for (i = j + C; i <= j + C; i++)
                print a[i]
}
因此,在您的情况下(这里用“NetApp”替换“裤子”),它实际上与(使用GNU
sed

个人提示:这就是我讨厌所谓的“一句话”的原因。它们很难看,没有人理解,而且完全无法维护。请,请,请,把复杂的任务放在脚本中,写得干净利落,加上注释,并将其用作你的“一句话”

EDIT:经过一些思考,我意识到这个脚本可能试图为
num=C
re=s
实现
grep-Cnum re
(获得
C
上下文行),但它在内部循环中得到了错误的循环索引(应该是
I=j-C;I谢谢Kusalanda:)现在我的好奇心被释放了!
你说得对,这个循环的范围最初设计为从j-c到j+c,但经过某种修改,可能有人打算只找到一行,而不是几行。

谢谢你,库萨兰达:)现在我的好奇心被释放了!
你说得对,这个循环的范围最初设计为从j-c到j+c,但经过某种修改,可能有人打算只查找一行,而不是几行。

如果你想学习
awk
,这里有一些有用的链接:如果你想学习
awk
,这里有一些有用的链接:
sed -n '/pants/,+1p' data.in | grep -v 'pants'
grep -A1 'pants' data.in | grep -E -v 'pants|-'