Сортировать уникальные строки на основе одного поля и решать, какие строки выводить на основе другого

Вот несколько способов, которыми вы можете извлечь данные1 из вашего ввода:

grep -oP '^[^"]*"\K[^"]*'

sed -ne '
   /\n/!{y/"/\n/;D;}
   P
'

perl -lne '/"([^"]*)"/ and print($1),last'
3
31.07.2019, 19:09
2 ответа

Если данные для вывода достаточно малы, чтобы поместиться в памяти, тогда

awk '
    biggest[$3] < $5 { biggest[$3]=$5 ; saved[$3]=$0 }
    END { for (i in saved) { print saved[i] }}' 

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

Это отличается от решения для сортировки, которое требует нескольких сравнений в строке. Решение на основе сортировки будет медленнее, но будет обрабатывать выходные данные, которые слишком велики для размещения в памяти.

1
27.01.2020, 21:21

Я бы просто отсортировал по 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 будет быстрее, поскольку ему нужно прочитать файл только один раз.

2
27.01.2020, 21:21

Теги

Похожие вопросы