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

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

Например:

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

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

One Solution collect form web for “Транспонировать несколько столбцов (разной длины) в строки”

Я бы использовал режим абзаца 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 ключей.

  • sed для ограничения столбцов до 15 символов
  • Сравните два файла с четырьмя столбцами
  • awk помещает последний столбец в новую строку
  • Сортировка только во втором столбце
  • Параметр «Заполнить столбцы перед строками» в команде столбца unix
  • Как заменить пустые ячейки определенного столбца
  • изменение разделителей столбцов в файле
  • Значения суммы из столбца 1, если строки столбца 2 соответствуют значению
  • Удалять строки из файлов с разделителями табуляции на основе общего столбца с другим файлом
  • `cut`: выбор столбцов, содержащих строку
  • Транспонирование нескольких столбцов - это строка
  • Linux и Unix - лучшая ОС в мире.