计算unix文件中的记录

时间:2010-02-17 17:03:35

标签: unix

这是一个面试问题,但仍然是一个编程问题。

我有一个带有两列名称和分数的unix文件。我需要显示所有分数的计数。

喜欢

jhon 100
丹200
抢100 迈克100

输出应为

100 3
200 1

你只需要使用内置的unix实用程序来解决它,所以我假设使用shell脚本。或者注册或unix命令

我理解循环是一种方法。存储你已经看过的所有值,然后grep每个记录看不见的值。任何其他有效的方法

5 个答案:

答案 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循环迭代,分别计算每个。效率不是很高,但很简单。如果文件不大,那不应该是一个太大的问题。