Извините, если это дублирующий вопрос, но я не смог найти нужный мне ответ ни здесь, ни в документации.
У меня есть файл, который выглядит примерно так:
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