【问题标题】:How to supress default print in awk?如何抑制awk中的默认打印?
【发布时间】: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=";" 也是一个好主意。

标签: awk gawk


【解决方案1】:

更改脚本以在BEGIN 块中包含分隔符。

脚本内容:

BEGIN {
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;
}

【讨论】:

  • 别以为是这样。该程序存储在一个文件中,使用gawk -f 调用。当我尝试你的建议时,我得到了backslash not last character on line
  • 最大的问题是OP改变了每一行的输入和输出字段分隔符,并且做了很奇怪和不好的事情。将它们放在BEGIN 块中,神奇地一切都会起作用,或者我希望如此。那些反斜杠对我来说毫无意义。它在 Linux 中给出了同样的错误。
  • Aaah,现在您更新了问题,这很有意义。您只需将FSOFS 包含在BEGIN 块中。这样做,你应该得到两行输出。
【解决方案2】:

不是您问题的答案,而是另一种计算时间的方法:

if (match($1, /([0-9]?[0-9]):([0-9][0-9]):([0-9][0-9]) ([AP]M)/, a)) {
    $1 = a[1] + (a[2]*60 + a[3])/3600 + (a[4] == "PM" ? 12 : 0)
}

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 2020-02-22
    • 1970-01-01
    • 2021-03-16
    • 2015-10-28
    • 2010-12-13
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多