这是一个面试问题,但仍然是一个编程问题。
我有一个带有两列名称和分数的unix文件。我需要显示所有分数的计数。
喜欢
jhon 100
丹200
抢100
迈克100
输出应为
100 3
200 1
你只需要使用内置的unix实用程序来解决它,所以我假设使用shell脚本。或者注册或unix命令
我理解循环是一种方法。存储你已经看过的所有值,然后grep每个记录看不见的值。任何其他有效的方法
答案 0 :(得分:2)
试试这个:
cut -d ' ' -f 2 < /tmp/foo | sort -n | uniq -c \
| (while read n v ; do printf "%s %s\n" "$v" "$n" ; done)
初始cut
可以替换为另一个while read
循环,这对输入文件格式变化(额外的空格)更具弹性。如果某些名称包含多个单词,则简单的字段提取将无法轻松完成,但sed
可以执行此操作。
否则,请使用您喜欢的编程语言。 Perl可能会闪耀。在Java或甚至在C或Forth中都不难。
答案 1 :(得分:1)
$ 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 }'
答案 2 :(得分:0)
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";
}
答案 3 :(得分:0)
你可以选择awk:
awk '/.*/ { a[$2] = a[$2] + 1; } END { for (x in a) { print x, " ", a[x] } }' record_file.txt
答案 4 :(得分:0)
或者使用shell命令:
for i in `awk '{print $2}' inputfile | sort -u`
do
echo -n "$i "
grep $i inputfile | wc -l
done
第一个awk命令将给出所有不同分数(例如100和200)的列表 for循环迭代,分别计算每个。效率不是很高,但很简单。如果文件不大,那不应该是一个太大的问题。