【问题标题】:counting records in unix file计算unix文件中的记录
【发布时间】:2010-02-17 17:03:34
【问题描述】:

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

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

喜欢

约翰 100
丹 200
抢100
迈克 100

输出应该是

100 3
200 1

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

我知道循环是一种方法。存储您已经看到的所有值,然后对每条记录进行 grep 以获取未见过的值。任何其他有效的方法

【问题讨论】:

  • 所以你的问题是?什么语言/环境/工具?我会使用awk
  • @thomas 是的,我想是的,

标签: unix


【解决方案1】:

试试这个:

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 中都不难。

【讨论】:

    【解决方案2】:
    $ 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 }'
    

    【讨论】:

      【解决方案3】:

      在 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";
      }
      

      【讨论】:

        【解决方案4】:

        你可以使用 awk:

        awk '/.*/ { a[$2] = a[$2] + 1; } END { for (x in a) { print x, " ", a[x] } }' record_file.txt
        

        【讨论】:

          【解决方案5】:

          或者使用 shell 命令:

          for i in `awk '{print $2}' inputfile | sort -u`
          do
              echo -n "$i "
              grep $i inputfile | wc -l
          done
          

          第一个 awk 命令将给出所有不同分数的列表(例如 100 和 200),然后 for 循环迭代,分别计数。不是很高效,但很简单。如果文件不是很大应该不是太大的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-17
            • 2015-06-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多