AWK进程页眉和页脚

AWK进程页眉和页脚,awk,Awk,我正在尝试使用awk脚本读取学生数据。该文件只有很少的页眉行和页脚行。(假设前3个和后3个) 实际学生数据放在页眉和页脚之间,用逗号分隔,如下所示 姓名、年龄、地点 我想打印学生的年龄以及页眉和页脚 样本数据: Header 1 Header 2 Header 3 dhana,28,USA subha,24,India Footer 1 Footer 2 Footer 3 Header 1 Header 2 Header 3 28 24 Footer 1 Footer 2 Footer 3

我正在尝试使用awk脚本读取学生数据。该文件只有很少的页眉行和页脚行。(假设前3个和后3个) 实际学生数据放在页眉和页脚之间,用逗号分隔,如下所示

姓名、年龄、地点

我想打印学生的年龄以及页眉和页脚

样本数据:

Header 1
Header 2
Header 3
dhana,28,USA
subha,24,India
Footer 1
Footer 2
Footer 3
Header 1
Header 2
Header 3
28
24
Footer 1
Footer 2
Footer 3
BEGIN{ FS = ","}
{ 
    if(NR > 3)
    {
        print $2
    }else{
        print $0
    }
}
Header 1
Header 2
Header 3
28
24
预期输出:

Header 1
Header 2
Header 3
dhana,28,USA
subha,24,India
Footer 1
Footer 2
Footer 3
Header 1
Header 2
Header 3
28
24
Footer 1
Footer 2
Footer 3
BEGIN{ FS = ","}
{ 
    if(NR > 3)
    {
        print $2
    }else{
        print $0
    }
}
Header 1
Header 2
Header 3
28
24
我的代码:

Header 1
Header 2
Header 3
dhana,28,USA
subha,24,India
Footer 1
Footer 2
Footer 3
Header 1
Header 2
Header 3
28
24
Footer 1
Footer 2
Footer 3
BEGIN{ FS = ","}
{ 
    if(NR > 3)
    {
        print $2
    }else{
        print $0
    }
}
Header 1
Header 2
Header 3
28
24
我的输出:

Header 1
Header 2
Header 3
dhana,28,USA
subha,24,India
Footer 1
Footer 2
Footer 3
Header 1
Header 2
Header 3
28
24
Footer 1
Footer 2
Footer 3
BEGIN{ FS = ","}
{ 
    if(NR > 3)
    {
        print $2
    }else{
        print $0
    }
}
Header 1
Header 2
Header 3
28
24

我正在使用NR运算符跳过标题。如何打印页脚并仅处理学生数据(年龄)?

Short
awk
解决方案:

awk -F',' 'NF == 3{ $0 = $2 }1' file
输出:

Header 1
Header 2
Header 3
28
24
Footer 1
Footer 2
Footer 3

双扫描算法将为您提供更多控制

$ awk -F, -v h=3 -v f=3 'NR==FNR {n=NR; next} 
                         FNR>h && FNR<=n-f {$0=$2}1' file{,}

Header 1
Header 2
Header 3
28
24
Footer 1
Footer 2
Footer 3
$awk-F,-vh=3-vf=3'NR==FNR{n=NR;next}

FNR>h&&FNRI认为使用类似的逻辑。有什么方法可以避免使用wc-l filename进行双重扫描并作为参数传递吗?您可以通过延迟处理(将'f'行保留在缓冲区中,而不是文件结束处理一)来完全消除这种情况,但是不确定它会增加代码复杂性。请注意,
wc
也在扫描文件,可能不会增加任何好处。你应该先计时,然后再尝试优化。。。