【发布时间】:2019-06-25 20:33:18
【问题描述】:
我正在处理一个文件,创建两个不同的关联数组来计算两种不同模式的频率(即字段 3 和 6,当找到时)。
文件示例:
2019-06-20 : INFO : XYZ_6789 : [Command [cmd_zip_files]:] Standard output and error
2019-06-20 : INFO : ABC_1234 : License issue
Line with no timestamp
2019-06-20 : INFO : XYZ_6789 : [Command [cmd_zip_files]:] Standard output and error
2019-06-20 : INFO : ABC_1234 : License issue
我想在最后打印两个数组,但它们的输出重叠。
我正在使用 GNU Awk 4.1.3。
我尝试使用“下一个/继续”语句,但它们似乎不是答案。
也许我以错误的方式使用了 END 规则。
#!/usr/bin/env awk
BEGIN {
FS="\\)? : \\(?| \\| |[][]"
MSG_COL=3
CMD_COL=6
SEP="=================="
}
{
if (match ($MSG_COL, /^[A-Z]{3}_[0-9]+/))
msg_count[$MSG_COL]++
if ($MSG_COL == "XYZ_6789")
cmd_count[$CMD_COL]++
}
END {
print ">> Count of msg <<"
for (msg in msg_count)
if (msg_count[msg] > 0)
print msg_count[msg], msg | "sort -n"
print ">> Count of cmd <<"
for (cmd in cmd_count)
print cmd_count[cmd], cmd | "sort -n"
}
我希望我的代码提供以下输出:
>> Count of msg <<
2 ABC_1234
2 XYZ_6789
>> Count of cmd <<
2 cmd_zip_files
虽然,我得到了这个:
>> Count of msg <<
>> Count of cmd <<
2 ABC_1234
2 cmd_zip_files
2 XYZ_6789
【问题讨论】:
-
你想明确地
close()每个管道。 -
@tripleee - GAWK user guide 表示 当打开文件或管道进行输出时,awk 会记住与其关联的文件名或命令,并随后写入同一文件或命令附加到先前的写入。文件或管道保持打开状态,直到 awk 退出。 如果我删除
| sort -n命令或使用您的建议(即使用close("sort -n")),则输出不会重叠。谢谢!
标签: awk