unix文件中的记录计数
这是一个采访问题,但仍然是一个编程问题 我有一个unix文件,它有两列名称和分数。我需要显示所有分数的计数 像 jhon 100unix文件中的记录计数,unix,Unix,这是一个采访问题,但仍然是一个编程问题 我有一个unix文件,它有两列名称和分数。我需要显示所有分数的计数 像 jhon 100 丹200 rob 100 迈克100 输出应该是 1003 200 1 您只需要使用内置的unix实用程序来解决它,所以我假设使用shell脚本。或reg ex.或unix命令 我知道循环是一种方法。存储您已经看到的所有值,然后对每个记录中未看到的值进行grep。在perl中没有非常复杂的任何其他有效方法: #!/usr/bin/perl -w use strict;
丹200
rob 100
迈克100
输出应该是 1003
200 1 您只需要使用内置的unix实用程序来解决它,所以我假设使用shell脚本。或reg ex.或unix命令
我知道循环是一种方法。存储您已经看到的所有值,然后对每个记录中未看到的值进行grep。在perl中没有非常复杂的任何其他有效方法:
#!/usr/bin/perl -w
use strict;
use warnings;
my %count = ();
while (<>) {
chomp;
my ($name, $score) = split(/ /);
$count{$score}++;
}
foreach my $key (sort keys %count) {
print "$key ", $count{$key}, "\n";
}
#/usr/bin/perl-w
严格使用;
使用警告;
我的%count=();
而(){
咀嚼;
我的($name,$score)=拆分(//);
$count{$score}++;
}
foreach my$键(排序键%count){
打印“$key”,$count{$key},“\n”;
}
试试这个:
cut -d ' ' -f 2 < /tmp/foo | sort -n | uniq -c \
| (while read n v ; do printf "%s %s\n" "$v" "$n" ; done)
cut-d'-f2
最初的cut
可以在read循环时用另一个替换,这将更能适应输入文件格式的变化(额外的空白)。如果一些名称由几个单词组成,那么简单的字段提取将不那么容易,但是sed
可以做到这一点
否则,请使用您最喜欢的编程语言。Perl可能会大放异彩。无论是在Java中,还是在C或Forth中,这都不难。您可以使用awk:
awk '/.*/ { a[$2] = a[$2] + 1; } END { for (x in a) { print x, " ", a[x] } }' record_file.txt
或者使用shell命令:
for i in `awk '{print $2}' inputfile | sort -u`
do
echo -n "$i "
grep $i inputfile | wc -l
done
第一个awk命令将给出所有不同分数(例如100和200)的列表,然后
for循环迭代,分别对每个循环进行计数。不是很高效,但很简单。如果文件不太大,就不应该是一个太大的问题
$ cat foo.txt
jhon 100
dan 200
rob 100
mike 100
$ awk '{print $2}' foo.txt | sort | uniq -c
3 100
1 200
遗憾的是,您不能单独使用sort或uniq进行计数
编辑:我刚刚注意到我前面有一个计数。。。要获得完全相同的结果,您可以执行以下操作:
$ awk '{print $2}' foo.txt | sort | uniq -c | awk '{ print $2 " " $1 }'
那么你的问题是?什么语言/环境/工具?我会使用awk
@thomas是的,我想是的,