【发布时间】:2013-06-11 20:36:23
【问题描述】:
这是 gawk 4.0.0,在 Windows 7 上使用 cygwin 运行。该程序被调用像
gawk -f procjournal.gawk testdata
我有一些看起来像这样的数据:
"Date";"Type";"Amount";"Balance"
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46
"6/11/2013 11:51:17 AM";"Market Transaction";47500;399314311.96
"6/11/2013 11:12:42 AM";"Transaction Tax";-549.92;399266811.96
"6/11/2013 11:12:42 AM";"Market Transaction";61101.78;399267361.88
我想提取交易行,从第一个字段中删除日期部分,并将时间戳重新格式化为小数。我想我可以用这个 awk 程序做到这一点:
FS=";"
OFS=";"
/Market Transaction/ {
split($1, itemdate, " ");
tmp = itemdate[2];
split(tmp, hms, ":");
timestamp = hms[3] + (hms[2] * 60) + (hms[1] * 3600);
if (itemdate[3] == "AM")
timestamp += 12 * 3600;
timestamp /= 3600.0;
$1 = timestamp;
print;
}
但我的输出如下所示:
"Date";"Type";"Amount";"Balance"
"Date";"Type";"Amount";"Balance"
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46
"6/11/2013 11:51:17 AM";"Market Transaction";47500;399314311.96
"6/11/2013 11:51:17 AM";"Market Transaction";47500;399314311.96
11.8547;"Market Transaction";47500;399314311.96
"6/11/2013 11:12:42 AM";"Transaction Tax";-549.92;399266811.96
"6/11/2013 11:12:42 AM";"Transaction Tax";-549.92;399266811.96
"6/11/2013 11:12:42 AM";"Market Transaction";61101.78;399267361.88
"6/11/2013 11:12:42 AM";"Market Transaction";61101.78;399267361.88
11.2117;"Market Transaction";61101.78;399267361.88
为什么会打印不匹配的行,我该如何抑制它?
【问题讨论】:
-
你有 FS=";"在动作块之外,因此它是一个条件。因此,它评估为 true 并调用打印当前记录的默认操作。 OFS=";" 同上。请参阅@Jaypal 的答案以了解如何解决此问题,当您希望两者具有相同的值时,使用
FS=OFS=";"也是一个好主意。