У меня есть следующие два файла (я добавил строки с точками, чтобы каждая строка в файле была одинаковой ширины и сделал file1 всеми заглавными буквами, чтобы сделать его более четким).
contents of file1:
ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE
contents of file2
Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Обратите внимание, что file2 длиннее file1.
Когда я запускаю эту команду:
paste file1 file2
Я получаю этот вывод
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Что я могу сделать, чтобы вывод был следующим?
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Я старался
paste file1 file2 | column -t
но это делает это:
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
не такой уродливый, как оригинальный вывод, но в любом случае неправильный по столбцам.
text-processing
columns
paste
Тулаинс Кордова
источник
источник
paste
использует вкладки перед строками из второго файла. Возможно, вам придется использовать постпроцессор для правильного выравнивания столбцов.paste file1 file2 | column -tn
?Ответы:
Предполагая, что в ваших файлах нет символов табуляции,
с
-t
соответствующим образом выбранным аргументом arg, чтобы покрыть желаемую максимальную ширину линии в файле1.OP добавил более гибкое решение:
Я сделал это, чтобы он работал без магического числа 13:
Это нелегко набрать, но можно использовать в скрипте.
источник
Я подумал, что awk мог бы сделать это хорошо, поэтому я погуглил «awk, читающий ввод из двух файлов» и нашел статью о stackoverflow для использования в качестве отправной точки.
Сначала сокращенная версия, затем полностью прокомментированная ниже. Это заняло больше, чем несколько минут, чтобы потренироваться. Я был бы рад некоторым усовершенствованиям от более умных людей.
И вот полностью документированная версия выше.
источник
Не очень хорошее решение, но я смог сделать это с помощью
где TAB заменяется символом табуляции.
источник
&&
в команде sed?&
помещает то, что ищет (вкладка в данном случае). Эта команда просто заменяет вкладку в начале двумя вкладками.TAB
это,\t
чтобы заставить это работать в zsh на Debian Ubuntu. И это работает, только если file1 имеет менее 15 символовВ Debian и производных,
column
имеет опцию-n
nomerge, которая позволяет столбцу делать правильные вещи с пустыми полями. Внутреннеcolumn
используетwcstok(wcs, delim, ptr)
функцию, которая разбивает строку широких символов на токены, разделенные широкими символами вdelim
аргументе.wcstok
начинается с пропуска широких символовdelim
до распознавания токена.-n
Опция использует алгоритм , который не пропустить начальную широкополую символыdelim
.К сожалению, это не очень переносимо:
-n
это специфично для Debian, иcolumn
не в POSIX, это, очевидно, вещь BSD.источник
Вынимаем точки, которые вы использовали для заполнения:
file1:
file2:
Попробуй это:
И вы получите:
источник
paste
, не позволит распечатать правильный вывод, если есть какие-либо строки, содержащие вкладки. +1 за отличияawk
Решение , которое должно быть достаточно портативным, и должны работать для любого числа входных файлов:источник
paste-awk
и попробовал,paste file1 file2|paste-awk
и я попытался,awk paste-awk file1 file2
но ни один не работал.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zero
awk -f paste-awk file1 file2
должно работать, по крайней мере, для GNU awk и mawk.paste
что между двумя рядами меньше места. И если входной файл имеет не все строки одинаковой длины, это приведет к выравниванию по правой строке-F\\t