Intereting Posts
Как заменить разделитель определенного столбца Функция в функции не будет вызвана несколько раз, если потребуется? Как удалить фрагмент диска с помощью Ubuntu? Есть ли надежный общесистемный эквалайзер с регулируемыми полосами частот для * buntu? поддерживаемая графическая карта Запуск прозрачного прокси для локальной сети и веб-сервера для WAN как программы скриншотов / скриншотов работают в системах POSIX с X? анализировать HTML в Bash (когда grep просто недостаточно) Как вы можете перемещать (или копировать) все файлы в каталог с тем же префиксом имени файла? Как я могу отфильтровать определенную часть ответа JSON в зольной оболочке Как заставить Portage всегда выбирать установку и обновление до последней доступной версии выбранного программного обеспечения? Я не могу получить исходный код источника Realtek 8723 это linux: все ли файл снижает производительность? dnsmasq – наводнение daemon.log с сообщениями Отправка команд в окно в tmux

Транспонировать несколько столбцов (разной длины) в строки

Аналогичный вопрос с моим был задан вопросом о переносе нескольких столбцов в строки. Однако конкретный формат столбца, с которым я имею дело, немного отличается тем, что мой файл содержит различное количество столбцов, которые иногда имеют дубликаты.

Например:

100 1 2 3 200 300 1 1 2 2 3 3 100 1 2 3 400 500 600 700 800 900 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 100 400 700 1 1 1 2 2 2 3 3 3 

Я хотел бы перенести эти столбцы в строки, которые выглядят следующим образом:

 100 1 2 3 200 1 2 3 300 1 2 3 100 1 2 3 400 1 2 3 500 1 2 3 600 1 2 3 700 1 2 3 800 1 2 3 900 1 2 3 100 1 2 3 400 1 2 3 700 1 2 3 

Затем отсортируйте строки по значениям первого столбца следующим образом:

 100 1 2 3 100 1 2 3 100 1 2 3 200 1 2 3 300 1 2 3 400 1 2 3 400 1 2 3 500 1 2 3 600 1 2 3 700 1 2 3 700 1 2 3 800 1 2 3 900 1 2 3 

И суммируйте значения для дублированных строк следующим образом:

 100 3 6 9 200 1 2 3 300 1 2 3 400 2 4 6 500 1 2 3 600 1 2 3 700 2 4 6 800 1 2 3 900 1 2 3 

Вы заметите, что, поскольку строки 100, 400 и 700 имели дубликаты, их столбчатые значения были суммированы.

Любые идеи или предложения приветствуются.

Я бы использовал режим абзаца Perl для этого:

 #!/usr/bin/env perl use strict; use warnings; my %final_lines; # Data structure to hold the modified lines my $filename = shift // die "No input file given!\n"; open my $IN,'<',$filename or die "Failed to open $filename for input: $!\n"; PARAGRAPH: { local $/=""; # Paragraph mode while(<$IN>){ # Read a new "paragraph" my @lines = split /\n/; my @fields = split /\s+/,(shift @lines); my $line_number =0; for my $line (@lines){ my @data = split /\s+/,$line; map { $final_lines{$fields[$_]}->[$line_number] += $data[$_] } (0..$#data); $line_number++; } } } for my $key (sort { $a <=> $b } keys %final_lines){ local $,=' '; print STDOUT $key,@{$final_lines{$key}}; print STDOUT "\n"; } 

Используйте его так:

 $ /path/to/script input_file > output_file 

Этот код проверен и должен работать нормально. Как отметил @cjm в комментариях, это, вероятно, займет некоторое время, если ваш входной файл большой. Шаг, который, скорее всего, займет время, – это окончательный sort ключей.