У меня очень большие данные, которые я хочу отсортировать
Итак, мой окончательный результат будет примерно таким:
1 11
1 13
1 15
2 3
2 5
chr2 6
chr2 15
chr15 3
chr15 9
Я использую sort в unix. Но я либо продолжаю получать chr2 вверху или внизу, с любым видом, который я пытаюсь. Вот некоторые из тех, что я пробовал: которые не дали мне желаемого результата:
sort -V -k1,1n -k2n final_merged.txt > merged-sort.txt
sort -k1,1n -k2n final_merged.txt > merged-sort.txt
sort -k1,1h -k2n final_merged.txt > merged-sort.txt
sort -k1,1 -k2n final_merged.txt > merged-sort.txt
Редактировать сообщение: Любой способ исправить эту проблему без перегрузки памяти при использовании
Спасибо,
могло быть иначе. Эта сортировка доставляла мне проблемы весь день. Я прочитал несколько руководств по сортировке, но не могу это исправить.
@chepner: это можно исправить любым способом.
вам нужна числовая сортировка, но «chr2» не является числом. вам нужен этап предварительной обработки, состоящий в разделении первого столбца на 2 столбца, один из «chr» (или пробел: «» в случае просто числа), а затем номер. возможно, sed или awk могут это сделать






Вам нужна числовая сортировка, но «chr2» не является числом. вам нужен этап предварительной обработки, состоящий в разделении первого столбца на 2 столбца, текстовую часть и числовую часть.
gawk 'match($1, /([^0-9])*([0-9]*)/, a) {print a[1], a[2], $2}' /tmp/abc |
sort -t ' ' -k1,1 -k2,2n -k3,3n
используйте gawk для разделения на регулярное выражение, не числовое, затем числовое, затем столбец 2 (теперь разделенный одиночными пробелами).
Сортировка по столбцам, разделенным одним пробелом.
gawk '{print $1 $2, $3}' для рекомбинации столбцов.
Возможно, вам придется изменить их, чтобы сохранить любые пробелы.
Пытаться:
sort -k1,2 -V final_merged.txt
Выполнение этого с использованием ваших образцов данных дает мне:
1 11
1 13
1 15
2 3
2 5
chr2 6
chr2 15
chr15 3
chr15 9
идеально. Я должен был переместить этот V.
Решение Python:
Инициализировать Естественная сортировка.
import re
_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
return [int(text) if text.isdigit() else text.lower()
for text in re.split(_nsre, s)]
Затем отсортируйте как хотите:
sorted_data = sorted(data, key=lambda item: (natural_sort_key(str(item[0])), item[1]))
сортировка в первую очередь по item[0] с помощью natural sort, а затем по item[1] численно.
OP заявляет, что коллекция не поместится в памяти, этот питон даже дважды запрашивает данные в памяти
Всегда ли префикс в столбце 1
chr(или хотя бы такое же количество символов)?