Вы можете использовать простой скрипт 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
.
Теперь, если ваш ключ, вероятно, содержит символы, * * * * * * * * * * * * *, такие как .
или [
, вам нужно остерегаться.