Unix awk脚本:打印从文件调查的总日期

时间:2014-04-30 19:07:44

标签: bash shell unix awk

我需要搜索一个文件,其中包含登录每个日期的人数,用户名和登录时间。运行的最后一次打印输出包含调查的总日期。脚本必须是awk,sed或grep。输出应该如下所示:

Oct 5 :===: 4
joesag    20:50
heidi3    17:42
jlandis   15:53
dskahnkar 21:51

此行将根据脚本找到的日期数而变化。我正在使用的文件只有5个,6个和7个3个不同的日期。 调查的总日期数为3

到目前为止,这是我的代码:

awk 'BEGIN{print "Oct 5 :===:"}; $4 ~ /5/{print $1, $5}' whotb
echo
awk 'BEGIN{print "Oct 6 :===:"}; $4 ~ /6/{print $1, $5}' whotb
echo
awk 'BEGIN{print "Oct 7 :===:"}; $4 ~/7/{print $1, $5}' whotb

这是打印出来的:

Oct 5 :===: 
jlandis 15:53 
dshankar 21:51 
heidi3 17:42 
revans 19:30
shawj 13:51 
axkrk 17:15 
emgarcia 13:31 
joesag 20:50

Oct 6 :===: 
hinze 12:17 
natasha 12:57 
lestrat 22:17 
eyora 18:46
hoythill 15:00 
wkb13 15:03 
wolves24 08:53 
fonstad 21:48 
joseher 18:08


Oct 7 :===: 
gelderen 05:52 
bwood3 04:43 
atsxc 05:40 
jaquez 05:48
jondrnj 05:50 
ash786 00:39 
yiyun827 01:07

输入文件有27行:

gelderen pts / 0 Oct 7 05:52(egelderen-c217.la.asu.edu)

bwood3 pts / 1 Oct 7 04:43(ss1-04.inre.asu.edu)

2 个答案:

答案 0 :(得分:1)

您放在END块中的计数器变量将不执行任何操作,因为在处理完文件后运行了END块。

我建议创建不同的数组(取决于日期)并将其中的对作为键。由于您提到该文件只有三个日期,您可以创建三个数组并在END块中迭代它们。

awk '
BEGIN { SUBSEP = FS }
$4==5 { fifth[$1,$5]++ }
$4==6 { sixth[$1,$5]++ }
$4==7 { seventh[$1,$5]++ }
END {
    print "Oct 5 :===: ", length(fifth); for(pair in fifth) print pair
    print "Oct 6 :===: ", length(sixth); for(pair in sixth) print pair
    print "Oct 7 :===: ", length(seventh); for(pair in seventh) print pair
}' whotb

答案 1 :(得分:0)

您可以尝试以下perl脚本:

#! /usr/bin/perl

use v5.12;

my %info;

while (<>) {
    my @fld=split(" ");
    my $key=join(" ",@fld[2..3]);
    if (!defined $info{$key}) {
        $info{$key}={num => 0, users => []};
    }
    $info{$key}->{num}++;
    my $user=join(" ",@fld[0,4]);
    push( @{$info{$key}->{users}}, $user);
}

for my $key (sort keys %info) {
    say $key,":===:",$info{$key}->{num};
    say $_ for (@{$info{$key}->{users}});
    say "";
}

./p.pl whotb

运行它