2015-01-06 6 views
3

У меня есть файл, который должен заполнить каждую строку пробелами примерно до 1100 символов из сценария bash. Каждая строка в файле в настоящее время имеет 900 символов.Как я могу поместить файл размером более 1024 символов в среду unix?

Естественный путь к этому является

awk -F, '{printf("%-1100s\n",$0)}' src.txt > dst.txt 

Однако я получаю сообщение об ошибке, говорящей мне

awk: formatted string too long 
record number 1 

После некоторых экспериментов и поиск в Интернете, я определил, что максимальная линия длина отформатированной строки awk может обрабатывать 1024.

Есть ли лучший способ обойти это ограничение?

(примечание: Я на SunOS бежать 5.10, и я не могу добавить инструменты GNU к нему и т.д.)

+0

Я не могу воспроизвести его, даже при использовании BSD AWK – anubhava

+0

Try 'во время считывания линия; do printf "% 1100s \ n" $ line; done dst.txt' – alvits

+0

nb, изменить влево выравнивать и править – BIBD

ответ

4

Получить GNU AWK.

$ awk 'BEGIN{printf "%-1100s\n", "foo"}' 
    foo 

Вы вероятно используете старый, разбитый awk - использовать nawk или /usr/xpg4/bin/awk на Solaris. Если у вас есть эта проблема с одним из них, используйте другую.

+3

no go, я не могу добавить GNU awk к этой системе – BIBD

+0

Я вижу, что вы добавили заметку, в которой говорится: «Я запущен на SunOS 5.10», , Почему вы пометили свой вопрос linux тогда? Вероятно, вы используете старый, сломанный awk - используйте nawk или/usr/xpg4/bin/awk в Solaris. –

+0

Linux-> SunOS - Исправлено, мое плохое. – BIBD

1

Если у вас есть perl, установленный на этой системе (возможно, да), вы можете установить такой сценарий, а затем запустить его, как pad.pl input.txt 1100 > output.txt.

#! /usr/bin/perl 

open (INPUT, "<$ARGV[0]"); 
$LENGTH=$ARGV[1]; 

while (<INPUT>) { 
    chomp($_); 
    while (length($_) < $LENGTH) { $_ = $_." "; } 
    print $_."\n"; 
} 

close INPUT; 
+0

Почему бы просто не взять длину' $ l' строки и добавить '($ LENGTH - $ l) x" "' к нему? –

+0

Да, я думаю, вы можете это сделать - это тоже должно быть быстрее. –

0

Вы можете попробовать:

awk '{ pad=1100-length($0); x = $0; 
    while (pad > 0) { x = x " "; pad--}; print x }' src.txt >dst.txt 

... который избегает использования printf() полностью, но делает несколько строк конкатенации вместо этого.

2

Был один другого решения я придумал:

awk -F, '{printf("%-900s\n",$0)}' src.txt > tmp1.txt 
awk -F, '{printf("%200s\n","")}' src.txt > tmp2.txt 
paste -d "\0" tmp1.txt tmp2.txt > dst.txt 

Это приводит в том же файле, как

nawk -F, '{printf("%-1100s\n",$0)}' src.txt > dst.txt 
+0

С стены - Мне нравится ваш стиль :-) Проголосовать! –

+0

Больше похоже на отчаяние - 10 Q – BIBD