Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
unix文件中的记录计数_Unix - Fatal编程技术网

unix文件中的记录计数

unix文件中的记录计数,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;

这是一个采访问题,但仍然是一个编程问题

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

jhon 100
丹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是的,我想是的,