сортировать выбранные записи на основе ключа в Unix - PullRequest
1 голос
/ 12 июля 2011

мой входной файл выглядит следующим образом.

01,A,34
01,A,35
01,A,36
01,A,37
02,A,40
02,A,41
02,A,42
02,A,45

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

01,A,37
01,A,36
01,A,35
02,A,45
02,A,42
02,A,41

, т.е. выбирать только три верхние записи (верхнее значение на основе 3-го столбца) на основе ключа(1-й и 2-й столбец)

Заранее спасибо ...

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Вы можете использовать простой скрипт bash, чтобы сделать это при условии, что данные такие, как показано.

pax$ cat infile
01,A,34
01,A,35
01,A,36
01,A,37
02,A,40
02,A,41
02,A,42
02,A,45

pax$ ./go.sh
01,A,37
01,A,36
01,A,35
02,A,45
02,A,42
02,A,41

pax$ cat go.sh
keys=$(sed 's/,[^,]*$/,/' infile | sort -u)
for key in ${keys} ; do
    grep "^${key}" infile | sort -r | head -3
done

Первая строка получает полный набор ключей, созданный из первых двух полей, удаляя последний столбец с помощью sed, затем сортируя выходные данные и удаляя дубликаты с помощью sort. В данном конкретном случае это клавиши 01,A, и 02,A,.

Извлекает соответствующие данные для каждого ключа (цикл for в сочетании с grep), сортирует в порядке убывания с sort -r и получает только первые три (для каждого ключа) с head .

Теперь, если ваш ключ, вероятно, содержит символы, * * * * * * * * * * * * *, такие как . или [, вам нужно остерегаться.

0 голосов
/ 12 июля 2011

С Perl :

perl -F, -lane'
  push @{$_{join ",", @F[0,1]}}, $F[2];
  END {
    for $k (keys %_) {
      print join ",", $k, $_
        for (sort { $b <=> $a } @{$_{$k}})[0..2]
      } 
    }' infile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...