3

У меня есть данные, которые выглядят так:

01234567
09876544
12345676
34576980

Мне нужно дополнить это 11 пробелами, т.е. мой вывод должен выглядеть так:

'           01234567' 
'           09876544'
'           12345676'
'           34576980'

Как я могу сделать это с помощью сценариев оболочки UNIX?

5 ответов5

10

Я предполагаю / предполагаю, что апострофы не должны быть включены в вывод.

Стандартное решение оболочки, где infile - это файл, содержащий входные данные:

while read i; do printf "%19s\n" "$i"; done < infile

где 19 - длина строки на строку в том виде, как они заданы (8) плюс требуемый отступ (11). Я снова предполагаю, что этот вид заполнения - это то, что вам нужно, а не просто добавление 11 пробелов ко всем строкам. Если это не так, вам нужно привести конкретный пример того, как должны обрабатываться входные строки различной длины.

Если апострофы должны были быть включены:

while read i; do printf "'%19s'\n" "$i"; done < infile
3

Более короткая опция из GNU coreutils - это команда pr :

pr -T -o 11 foo.txt

Выдержка из справочной страницы:

DESCRIPTION
       Paginate or columnate FILE(s) for printing.

       -o, --indent=MARGIN
              offset each line with MARGIN (zero) spaces

       -T, --omit-pagination
              omit page headers and trailers, eliminate any pagination by form feeds set in input files
0

Предполагая, что данные находятся в текстовом файле:

    $ cat file.txt 
    01234567
    09876544
    12345676
    34576980

Используйте команду sed или однострочник Perl следующим образом:

    $ sed -n "s#^\(.*\)#\'           \1\'#p" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

-n :    By default, each line of input is echoed to the standard output after 
        all of the commands have been applied to it.  The -n option suppresses
        this behavior.
 p :    Print the current pattern space.


    $ perl -p -e "s#^(.*)#\'           \$1\'#" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

−p: Assumes an input loop around the script. Lines are printed.
−e commandline:
May be used to enter a single line of script. Multiple −e commands
build up a multiline script.

Я пробовал эти команды в Ubuntu Linux.

0

Вы можете использовать Ex-редактор (Vi), либо изменив файл на месте:

ex -s +"%s@^@    @" -cwq foo.txt

или путем анализа стандартного ввода и вывода его на стандартный вывод:

cat foo.txt | ex -s +"%s@^@    @" +%p -cq! /dev/stdin
-1

Это дополнение к ответу @Daniel Andersson, если длина каждой строки, считываемой из файла, меняется, вы можете сделать следующее:

while read i; do printf "%11s%s\n" "" "$i"; done < infile

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .