【问题标题】:AWK process header and footerAWK 进程页眉和页脚
【发布时间】:2018-05-26 04:32:56
【问题描述】:

我正在尝试使用 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

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

【问题讨论】:

    标签: awk


    【解决方案1】:

    awk解决方案:

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

    输出:

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

    【讨论】:

      【解决方案2】:

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

      $ 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
      

      其中hf 指定要跳过处理的页眉和页脚行。

      【讨论】:

      • 我想过使用类似的逻辑。有什么方法可以避免双重扫描并使用 wc -l 文件名作为参数传递?
      • 您可以通过延迟处理来完全消除(将“f”行保留在缓冲区中,而不是文件进程的末尾),但是不确定它会增加的代码复杂性。请注意,wc 也在扫描文件,可能不会增加任何好处。不过,您应该先计时,然后再尝试优化...
      猜你喜欢
      • 1970-01-01
      • 2020-11-30
      • 2011-08-17
      • 2017-03-20
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多