У меня есть файл со строками, как показано ниже.
title1:A1
title2:A2
title3:A3
title4:A4
title5:A5
title1:B1
title2:B2
title3:B3
title4:B4
title5:B5
title1:C1
title2:C2
title3:C3
title4:C4
title5:C5
title1:D1
title2:D2
title3:D3
title4:D4
title5:D5
Как мне этого добиться?
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
Ответы:
Посмотрите на GNU datamash, который можно использовать как
datamash transpose
. Будущая версия также будет поддерживать кросс-табуляцию (сводные таблицы)источник
Помимо использования собственного решения для транспонирования строк со столбцами из командной строки, единственный инструмент, который я когда-либо видел, может это сделать - это инструмент, называемый по иронии судьбы
transpose
.Установка
К сожалению, его нет в репозитории, поэтому вам нужно скачать и скомпилировать его. Это довольно просто, поскольку у него нет дополнительных библиотек, от которых он зависит. Это можно сделать так:
использование
Он может легко обрабатывать простые текстовые файлы. Например:
Можно транспонировать с помощью этой команды:
Эта команда предназначена
transpose
для transpose (-t
), а используемый разделитель полей - это пробел (--fsep " "
).Ваш пример
Поскольку ваши образцы данных представлены в несколько более сложном формате, их необходимо обрабатывать в 2 этапа. Сначала нам нужно перевести его в формат, с которым
transpose
можно иметь дело.Запустив эту команду, вы поместите данные в более удобный формат:
Теперь нам просто нужно удалить вторичные вхождения title1, title2 и т.д .:
Это теперь в формате, который
transpose
может иметь дело с. Следующая команда сделает всю транспозицию:источник
Вы можете использовать их
awk
для обработки данныхpaste
иcolumn
их форматирования.Здесь я предполагаю, что
title1
это только пример в вашем посте, и эти данные не содержат ничего,:
кроме как разделитель между заголовком + данные.n
указывает, сколько столбцов нужно напечатать (должно совпадать с тиреpaste
).Если вы хотите сделать его более гибким и простым в обслуживании, вы можете написать его в виде скрипта. Вот пример использования оболочки bash для
awk
и переданного по каналуcolumn
. Таким образом, вы также можете выполнять дополнительную проверку данных, например, проверяя правильность заголовков во всех строках и т. Д.Обычно используется как:
Если заголовки всегда короче , чем данные , которые вы можете также сохранить ширины заголовка, то
printf
с%-*s
и пропуститьcolumn
все вместе.источник
Вот быстрый способ поместить файл в нужный вам формат:
Если вы хотите заголовки столбцов:
Как работает 2-я команда
печать баннера положить возврат после баннера в печать строк данныхисточник
Утилита GNU datamash
Взято с этого сайта, https://www.gnu.org/software/datamash/ и http://www.thelinuxrain.com/articles/transposing-rows-and-columns-3-methods
источник
Вероятно, есть более краткий способ сформулировать это, но, похоже, это дает общий эффект:
множественный
sed
вызовов не кажутся правильными (и я уверен, что sed может также выполнить перевод новой строки), так что это, вероятно, не самый простой способ сделать это. Кроме того, это удаляет потенциальные заголовки, но вы можете сгенерировать их вручную, если вы правильно отформатировали строки / поля.Лучший ответ, вероятно, будет сводить этот эффект к простому использованию
sed
илиawk
выполнению этого, чтобы за один раз происходило только одно. Но я устал, так что это то, что я смог собрать.источник
paste
это, вероятно, ваш лучший выбор. Вы можете извлечь соответствующие биты сcut
,grep
иawk
это нравится:Если пятый столбец должен быть удален, добавьте
awk 'NR%5'
так:Теперь колонку с
paste
:Выход:
источник
Только для части транспонирования у меня недавно была похожая проблема, и я использовал:
Отрегулируйте FMT по мере необходимости. Для каждой входной строки он объединяет все поля в элемент массива. Обратите внимание, что конкатенация строк awk неявна: это происходит, когда вы пишете две вещи без оператора.
Пример ввода / вывода:
выход:
источник
Самое простое, что вы можете сделать, это использовать
cut
для вырезания полей, а затем использовать,tr
если вы переносите строки в столбцы, заменяя символ новой строки на символ табуляции: http://www.gnu.org/software/coreutils/manual/ coreutils.html # тр-вызовисточник
cut
возвращает ошибку.