Мне нужно отсортировать столбцы очень большого набора данных (1000 строк и 700000 столбцов). Например, мои столбцы расположены случайным образом, как: col1 col4 col3 col2, и мне нужно отсортировать их.
Я пробовал некоторые команды, но безуспешно.
пример:
ID M2 M5 M8 M1 M3 M9 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln
В этом примере точки означают, что у меня много столбцов и строк. Опять же, мне нужно отсортировать столбцы так:
ID M1 M2 M3 M4 M5 M6 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln
Спасибо
text-processing
awk
LLVerardo
источник
источник
Ответы:
С GNU
datamash
и GNUsort
:Это прекрасно работает для «достаточно маленьких» данных. Это может или не может работать с вашим файлом.
Изменить: Решения ниже без транспозиции должны быть менее ресурсоемкими.
источник
datamash
например,rs -T < file_in.csv | sort | rs -T -C' '
(rs
должна быть доступна в виде пакета в системах на основе Debian)rs
(«преобразовать массив данных») доступен в базовых системах некоторых BSD.M
встречающейся в начале, используя хорошо известныеSchwartzian maneuver
. Это позволяет нам переупорядочивать индексы, чтобы столбцы выходили в числовом порядке (M1, M2, M3, ...)@I
для перестановки@F
элементов.-p
Опция Perl включает автопечать$_
содержимого,-l
добавимnewline
.источник
Использование модуля Perl Sort :: Naturally
входные данные
выход
источник
Если у вас установлена
rs
утилита , вы можете сделать это:Или все в одной строке:
rs
транспонирует входные данные (с разделенными пробелами полями)sed
читает первую строку, выводит ее, затем завершает работу, оставляя остальную часть каналаrs
нетронутой.stdbuf
требуется, чтобы гарантировать, чтоsed
только чтение до первой новой строки и не дальше, отключив входную буферизациюsort
с оставшимися строкамиrs
транспонирует результирующий поток обратно в исходный формат.rs
установлен по умолчанию на MacOS. В системах Linux вам, возможно, придется установить его - например,Опция Caveat:
stdbuf
иsort
s-V
специфична для GNU, поэтому не будет работать на неизмененном MacOS.источник
Если у вас есть GNU
awk
, вы можете попробовать это:источник
В Python:
источник
Я не знаю, считали ли вы это хорошим ответом, но ...
Почему вы не используете базу данных для решения этой проблемы? Вы можете импортировать ваш набор данных как временную таблицу, а затем сделать
Вы можете использовать другие фильтры или преобразования по мере необходимости. Затем вы можете переформатировать вывод, как вам нужно.
Все эти задачи могут быть запрограммированы как bash-скрипт и объединять в цепочку результаты, используя каналы.
Иногда я использовал команду "pv", чтобы увидеть прогресс между командами.
Чтобы импортировать набор данных, вы можете запрограммировать ETL, используя интеграцию данных Pentaho.
источник
Может быть, это также может помочь вам.
Пример:
источник