我需要搜索一个文件,其中包含登录每个日期的人数,用户名和登录时间。运行的最后一次打印输出包含调查的总日期。脚本必须是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)
答案 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