подсчет записей в файле unix - PullRequest
1 голос
/ 17 февраля 2010

Это был вопрос интервью, тем не менее, все еще вопрос программирования.

У меня есть Unix-файл с двумя столбцами: имя и оценка. Мне нужно отобразить счет всех результатов.

как

Джон 100
дан 200
грабить 100
микрофон 100

вывод должен быть

100 3
200 1

Вам нужно только использовать встроенную утилиту Unix для ее решения, поэтому я предполагаю использовать сценарии оболочки. или рег. отл. или unix команды

Я понимаю, что цикл был бы одним из способов сделать это. сохранить все значения, которые вы уже видели, а затем выполнить поиск каждой записи для невидимых значений. любой другой эффективный способ сделать это

Ответы [ 5 ]

2 голосов
/ 17 февраля 2010

Попробуйте это:

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 голос
/ 25 апреля 2014
$ 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 }'
0 голосов
/ 17 февраля 2010

В качестве альтернативы с командами оболочки:

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

Первая команда awk выдаст список всех различных оценок (например, 100 и 200), которые затем цикл for повторяется, считая каждый в отдельности. Не очень супер эффективно, но просто. Если файл не слишком большой, это не должно быть слишком большой проблемой.

0 голосов
/ 17 февраля 2010

Вы можете пойти с awk:

awk '/.*/ { a[$2] = a[$2] + 1; } END { for (x in a) { print x, " ", a[x] } }' record_file.txt
0 голосов
/ 17 февраля 2010

Не очень сложно в 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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...