我正在学习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
变量d
是20190306
.
但问题以及我要问的是如何将此输出重定向到文件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