使用awk处理文件

使用awk处理文件,awk,Awk,我正在寻找awk命令来将文本文件的时间列更改为最接近的5分钟间隔。所以12:56:59变成了12:55:00 以下命令按预期工作。谢谢你的回复 head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' | awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}' 正确结果: 2012-03-10 12:55:00 但我也希望显示日期以外的

我正在寻找awk命令来将文本文件的时间列更改为最接近的5分钟间隔。所以12:56:59变成了12:55:00

以下命令按预期工作。谢谢你的回复

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'
正确结果:

2012-03-10 12:55:00
但我也希望显示日期以外的字段。以下操作不起作用:

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $1, $2, $7, $8}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'
错误结果:

565 14718:00:00
应该是

565 123 2012-03-10 12:55:00 country

您不需要多个awk命令,只需要一个,您可以在脚本中设置awk的FS field separator变量,您可以将其放入一个文件中:

$ cat foo.awk
BEGIN {
    # all fields are separated by ^
    FS = "^";
}
{
    # $7 is the date and time in the form yyyy-mm-dd hh:mm:ss.
    # Split at colons to get hours minutes and seconds into a[1]
    # through a[3].  Round minutes to nearest 5.
    split($7, a, ":");
    a[2] = int(a[2] / 5) * 5;

    # print first and second field, then rounded time, then 8th field.
    printf "%s %s %s:%02d:00 %s\n", $1, $2, a[1], a[2], $8;
}
$ cat input
565^123^$3^$4^$5^$6^2012-03-10 12:56:59^country
$ awk -f foo.awk < input
565 123 2012-03-10 12:55:00 country
$ 

可能的复制品正是我在寻找的。还有一个请求。。。我使用sed's/\/~/g'将所有空格替换为特殊字符。是否可以在同一awk计划中执行此操作?是的,使用gsub进行全局替换和替换。它返回替换的计数,您可以忽略该计数。例如:gsub,~;在最终打印之前插入F将替换所有字段中的所有空格。因此,如果国家是Berzerkistan的人民共和国,那么产量将是565 123 2012-03-10 12:55:00 Berzerkistan的人民共和国。gsub将处理时间增加了10倍。所以不包括它。