Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何抑制awk中的默认打印?_Awk_Gawk - Fatal编程技术网

如何抑制awk中的默认打印?

如何抑制awk中的默认打印?,awk,gawk,Awk,Gawk,这是在装有cygwin的Windows7上运行的Gawk4.0.0。程序的调用方式如下 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

这是在装有cygwin的Windows7上运行的Gawk4.0.0。程序的调用方式如下

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
"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
我想提取事务的行,从第一个字段中去掉日期部分,并将时间戳重新格式化为十进制。我想我可以用这个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"
"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
"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

为什么要打印不匹配的行,以及如何抑制这些行?

更改脚本以将分隔符包括在
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;
}

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

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)
}

别以为是这样。该程序存储在一个文件中,用
gawk-f
调用。当我尝试你的建议时,我得到了
反斜杠而不是第行的最后一个字符
。最大的问题是OP更改了每行的输入和输出字段分隔符,并且做了非常奇怪和糟糕的事情。把它们放在
BEGIN
块中,一切都会神奇地工作,或者我希望如此。那些反斜杠对我来说毫无意义。它在Linux.Aaah中给出了相同的错误,现在您已经更新了这个问题,这是有意义的。您只需要在
BEGIN
块中包含
FS
OFS
。这样做,您应该得到两行输出。您在操作块之外有FS=“;”,因此这是一个条件。因此,它的计算结果为true,并调用打印当前记录的默认操作。OFS=“;”同上。请参阅@Jaypal的答案以了解如何解决此问题,当您希望两者具有相同的值时,最好使用
FS=OFS=“;”
以获得简洁性。