Вот несколько способов, которыми вы можете извлечь данные1 из вашего ввода:
grep -oP '^[^"]*"\K[^"]*'
sed -ne '
/\n/!{y/"/\n/;D;}
P
'
perl -lne '/"([^"]*)"/ and print($1),last'
Если данные для вывода достаточно малы, чтобы поместиться в памяти, тогда
awk '
biggest[$3] < $5 { biggest[$3]=$5 ; saved[$3]=$0 }
END { for (i in saved) { print saved[i] }}'
В целом это будет быстрее, каждую строку нужно просматривать сразу, когда решается, нужно ли ее сохранять. Требование к памяти для данных, которые выводятся, поэтому очень повторяющийся ввод может быть огромным.
Это отличается от решения для сортировки, которое требует нескольких сравнений в строке. Решение на основе сортировки будет медленнее, но будет обрабатывать выходные данные, которые слишком велики для размещения в памяти.
Я бы просто отсортировал по 2-му и 3-му полям напрямую и прошел через awk
, чтобы сохранить максимальное значение:
$ sort -k 3,3nr -k 5,5rn input | awk '!a[$3]++'
SMURF1 7 99143726 GACAGATTGG 74
CSNK1D 17 82251379 AATTTAGCCA 68
UBE2Z 17 48910880 CTAAGGATCC 48
AC003665.1 17 47813266 AGCAGGCGCA 83
RIOK3 18 23453502 GCAAGACTTT 69
Это имеет то преимущество, что сортирует файл только один раз, а также не требует хранения всего файла в памяти. Тем не менее, я ожидаю, что awk-подход Icarus будет быстрее, поскольку ему нужно прочитать файл только один раз.