Сортировка unix по алфавиту, а затем по номерам не работает так, как я предполагал

Сортировка unix по алфавиту, а затем по номерам не работает так, как я предполагал

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

У меня есть файл, который выглядит примерно так:

chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr4_oligo95    50  100
chr5_oligo1 50  100
chr4_oligo4 150 200

Желаемый результат выглядит так:

chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo95    50  100
chr4_oligo4 150 200
chr5_oligo1 50  100

Шаблон в начале (например, chr#_oligo#) имеет значение только с точки зрения chr#, то есть все chr1 должны быть первыми, затем chr2, затем chr3 и т. д., но я хотел бы отсортировать эти подстроки численно в группах, как показано в желаемом выводе выше. Поэтому я хотел бы знать, как сортировать по алфавиту в случае первого столбца, а затем, сохраняя этот порядок (chr1->chrN), сортировать каждый фрагмент данных численно.

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

sort -k1,1 -nk2

выполняет правильную числовую сортировку, но не сохраняет первую сортировку нетронутой (перемешивает первый столбец и объединяет все строки, при этом столбцы 2 и 3 выглядят следующим образом:

50   100

Я использую Mac OS X.

ПРАВКА: Я хочу изменить некоторые примеры в первом столбце, чтобы показать больше того, что я ищу. gsort -V отлично работает, если имя в первом столбце указано в числовом порядке, но в моем наборе данных это не всегда так.

Я хотел бы по сути отсортировать каждую подгруппу (в данном случае chr1, chr2 и т. д.) по столбцу 2 итеративно. Я понимаю, что это можно легко сделать, выполнив grep для каждой и затем отсортировав ее по столбцу 2, но я хотел бы узнать, может ли sort или другая команда unix сделать это в одиночку.

решение1

sort -k1,1 -nk2то же самое, что и sort -k1,1 -n -k2, то же самое sort -n -k1,1 -k2, что и , как вчисловойсортировка включена глобально, для всех ключей.

Чтобы отсортировать второй ключ только по числам, необходимо добавить nк этому ключу сортировки описание, например:

sort -k1,1 -k2n

Или:

sort -k1,1 -k2,2n

С nи с разделителем полей по умолчанию 2это то же самое 2,2, как если бы 2это была часть строки, начинающаяся со второго поля, но если интерпретировать ее как число, это то же самое, что и второе поле отдельно ( 2,2).

Здесь вы также можете выполнить числовую сортировку по следующему числу chr, а затем в алфавитном порядке по оставшейся части первого поля и затем по числовому полю по второму полю с помощью:

sort -k1.4n -k1,1 -k2n

решение2

сортировка по алфавиту по 1-му полю и по номерам по 2-му дает (в вашем выводе, -- chr4_oligo95 находится перед ch4_oligo4)

sort -k1,1 -k2n,2n file 
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo4 150 200
chr4_oligo95    50  100
chr5_oligo1 50  100

Связанный контент