сортировать численно, а затем по алфавиту в том же столбце - PullRequest
0 голосов
/ 01 июня 2018

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

  • столбцу 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
  • python

Спасибо,

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Попробуйте:

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
0 голосов
/ 01 июня 2018

Решение 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].

0 голосов
/ 01 июня 2018

Вы хотите числовую сортировку, но '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}' для рекомбинации столбцов.

Возможно, вам придется изменить этисохранить все необходимое для пробела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...