【发布时间】:2015-08-21 02:35:40
【问题描述】:
我正在尝试使用 gawk 处理一堆提取数据的文件。
文件区定宽空格格式化文件
我正在尝试从两个不同的正则表达式匹配的两个不同的行中提取数据,但在 ONE print 语句中返回这两行的数据。
我可以在.awk 文件中使用以下内容来实现这一点,并使用gawk -f 来运行它。第一个 BEGIN 部分设置输入文件格式 (FIELDWIDTHs),第二个 BEGIN 我试图使用每个文件的循环来根据提取的数据进行输出。第一个 END 完成内部 BEGIN,第二个匹配外部 BEGIN。
但是我一次只能将它应用到一个文件,因为如果我应用到一堆文件(如 gawk -f regex.awk km*.txt ,我只能得到最后一个文件的输出。
我能否在每个文件输入中获得一行输出,而不必求助于脚本文件循环输入文件并每次都运行 awk 脚本。
谢谢
BEGIN{
OFS=","; FIELDWIDTHS ="2 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12";
printf("Date, Turnover, SalesA, SalesB, SalesC, SalesD, Other Data\n");
}
BEGIN{ Sales = 0;
SalesA = 0;
SalesB = 0;
SalesC = 0;
SalesD = 0;
JointSales = 0;
Turnover = 0;
OtherData = 0;}
/^03/ || /^06/ {
if ($1 == "03") {
Sales = $15/100;
SalesA = $17/100;
SalesB = $26/100;
SalesC = $20/100;
SalesD = $22/100;
JointSales = SalesA - SalesB;
Turnover = JointSales + SalesB + SalesC + SalesD; }
else if ( $1 == "06") {
OtherData = substr($0,183,12)/100; }
# printf("%s, %10.2f, %10.2f, %10.2f, %10.2f, %10.2f, %10.2f\n", getDate(FILENAME), Sales, JointSales, SalesB, SalesC, SalesD, OtherData )
}
END{printf("%s, %10.2f, %10.2f, %10.2f, %10.2f, %10.2f, %10.2f\n", getDate(FILENAME), Sales, JointSales, SalesB, SalesC, SalesD, OtherData ) }
END {}
function getDate(str)
{ date = substr(str,3,6);
year = substr(date,1,2);
month= substr(date,3,2);
day=substr(date,5,2);
odate=(day"/"month"/"year);
return odate
}
【问题讨论】:
-
您希望多个
BEGIN和END块在做什么?你只能得到一个。BEGIN在 awk 进程开始时运行,END在结束时运行。如果您正在寻找在每个已处理文件的开头和结尾运行事物的方法,请查看使用FNR。 -
@EtanReisner 不,您可以拥有任意数量的 BEGIN 和 END 部分,将它们全部放在一个文件中是没有意义的。当您将多个部分脚本存储在多个文件中并且您想要运行一个将所有这些文件串联起来的脚本时,就可以使用它了。我不明白 OP 想要做什么,他需要发布一些示例输入和预期输出,然后才能得到一个解决方案,告诉他如何实现他想要做的任何事情,而不是如何做他需要做的事情.
-
@EdMorton 确实如此。 rici 在下面的评论中纠正了我的误解,是的,现在我考虑到它,我绝对可以看到它在构建更复杂的脚本中的用途。