Сортировать численно, а затем алфавитно в том же столбце

У меня очень большие данные, которые я хочу отсортировать

  • столбец 1: сначала в цифровом, а затем в буквенно-цифровом виде
  • затем по столбцу 2: численно.

Итак, мой окончательный результат будет примерно таким:

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

Редактировать сообщение: Любой способ исправить эту проблему без перегрузки памяти при использовании

  • sort или другие утилиты unix
  • питон

Спасибо,

Всегда ли префикс в столбце 1 chr (или хотя бы такое же количество символов)?

chepner 01.06.2018 01:36

могло быть иначе. Эта сортировка доставляла мне проблемы весь день. Я прочитал несколько руководств по сортировке, но не могу это исправить.

everestial007 01.06.2018 01:40

@chepner: это можно исправить любым способом.

everestial007 01.06.2018 02:01

вам нужна числовая сортировка, но «chr2» не является числом. вам нужен этап предварительной обработки, состоящий в разделении первого столбца на 2 столбца, один из «chr» (или пробел: «» в случае просто числа), а затем номер. возможно, sed или awk могут это сделать

Evan Benn 01.06.2018 02:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужна числовая сортировка, но «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.

everestial007 01.06.2018 04:46

Решение 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 заявляет, что коллекция не поместится в памяти, этот питон даже дважды запрашивает данные в памяти

Evan Benn 01.06.2018 03:37

Другие вопросы по теме