awk:打印到文件,该文件的名称来自命令中定义的变量

awk:打印到文件,该文件的名称来自命令中定义的变量

我正在学习awk。在尝试寻找问题的解决方案时,我找到了下一个代码,但我卡在了最后¹。解释:

具有file内容:

H|20200425|abcd|    # header
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
  • 添加在最后

    T|20200425|-count of records-|-sum of 4th column-
    
  • 将输出定向到文件20190306.txt,即第三列的日期,格式为 YYYYMMDD。

我的尝试:

awk -F'|' '
  # get the date formatted
  NR == 2 { 
    d = $3; gsub(/-/,"",d) 
  } 
  # get the 2nd field of the header
  NR == 1 { 
    a = $2 
  } 
  # if the line starts with 'R', sum the column and get the count of them
  $1 == "R" { 
    sum += $4
    ++c 
  } 
  # print the final line with variables acquired
  END { 
    OFS = "|"; print "T",a,c,sum".00" 
  }1
' file

这个命令给了我“期望的”结果:

H|20200425|abcd|    
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
T|20200425|3|125.00

变量d20190306.

但问题以及我要问的是如何将此输出重定向到文件20190306.txt


``当然,这是糟糕的编码,(,脑痛),但我的目标是尽可能集中问题,我并不是要求指出所有错误。

答案1

您可以将记录打印到名称存储在 awk 变量中的文件中d,只需将隐式打印操作(由模式触发1)替换为显式打印操作即可。{print > d}

d棘手的是,在处理第二条记录之前,您不知道 的值;所以你需要保存标题记录直到那时。

例如:

$ awk -F'|' '
  # get the 2nd field of the header
  NR == 1 { 
    a = $2 
    h = $0
    next
  } 
  # get the date formatted
  NR == 2 { 
    d = $3; gsub(/-/,"",d) 
    print h > d
  } 
  # if the line starts with 'R', sum the column and get the count of them
  $1 == "R" { 
    sum += $4
    ++c 
  } 
  {
    print > d
  }
  # print the final line with variables acquired
  END { 
    OFS = "|"; print "T",a,c,sum".00" > d
  }
' file

相关内容