Найти самую длинную строку в текстовом файле и заполнить все строки этой длины «пробелами»? - PullRequest
3 голосов
/ 24 июня 2010

Как найти самую длинную строку в файле .txt, а затем заполнить все остальные строки в конце до этой длины пробелами?

Я думаю, это легко ответить. Я очень мало знаю об использовании команды awk, paste и тому подобное. Может быть, кто-то может мне помочь. Спасибо!

Немного конкретнее ... пока я могу сделать следующее. Это получит самую длинную строку из файла .txt:

awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' in.txt

Заполняет строки пробелами (до 50):

awk  'length <= 50 { printf "%-50s\n",$0 }' in.txt > out.txt

Я просто не знаю, как передать значение из одной строки в другую.

Почему я спрашиваю это? Я хочу объединить два файла .txt с помощью команды вставки. Текст B будет расположен справа от текста A. Строки в тексте A будут иметь разную длину. Так что, если не хватает пустых мест, макет не подходит.

Ответы [ 7 ]

5 голосов
/ 24 июня 2010

Обычно я нахожу, что этот тип вопроса является результатом этого мыслительного процесса:

  1. Я пытаюсь решить проблему A
  2. Я думаю, что процесс B решит A
  3. Я спрошу, как добиться процесса B

Вы получите буквальные ответы о том, как выполнить процесс B, но если вы включите В контексте проблемы А вы получите лучшие ответы и, вероятно, тот, который решает задача A проще, чем процесс B.

Итак, какую проблему вы пытаетесь решить, делая все строки в файле одинаковой длины?

3 голосов
/ 24 июня 2010

Это все, что вам нужно:

pr  -W 80 -mtT file1 file2

Или, более подробно:

pr --page-width=80 --merge --omit-header --omit-pagination file1 file2

Измените число, чтобы изменить формат результата.

2 голосов
/ 25 июня 2010

вот как можно с помощью awk.

$ more file
jlsf
slf
asdfasfs
sd

$ awk 'FNR==NR{t=(length>=t)?length:t;next}length<t{for(o=1;o<=t-length;o++)s=s "|";$0=$0s;s=""}1' file file
jlsf||||
slf|||||
asdfasfs
sd||||||

Изменить "|" в пространства по желанию.

2 голосов
/ 24 июня 2010

Вы можете использовать wc для подсчета количества символов в строке. Измерьте все строки в файле, чтобы найти самую длинную длину. Для всех других файлов (максимальная длина - длина строки) дает количество пробелов, которые нужно напечатать в конце строки (что вы можете сделать с помощью printf).

Обновление: Требуется ли использование awk? Если нет, попробуйте это:

# Measure the longest line in the file
maxlen=`wc -L filename.txt | cut -d ' ' -f 1`

# Pad each line to $maxlen characters
while read line
do
    printf "%-${maxlen}s\n" "$line" >> outfile.txt
done < filename.txt

Редактировать # 2: Если у вас нет опции -L для wc, вы можете рассчитать длину самой длинной строки, используя следующий цикл:

maxlen=0
while read line
do
    thislen=`echo $line | wc -c`
    [ $[$thislen>$maxlen] ] && maxlen=$thislen
done < filename.txt

Конечное значение $maxlen будет длиной самой длинной строки.

1 голос
/ 24 июня 2010

Если «сценарии оболочки» могут включать сценарии Python, что-то вроде этого:

maxLen = 0
infile = open("file.txt", 'r')
outfile = open("out.txt", 'w')
for line in infile:
    if len(line)>maxLen: maxLen = len(line)
infile.seek(0)
for line in infile:
    rawline = line.strip('\r\n')
    out.write (rawline + ''.join([' ' for i in range(maxLen-len(rawline))]) + "\n")
infile.close ()
outfile.close ()

Исправление любых ошибок, оставленных одним, оставлено читателю в качестве упражнения! : -)

1 голос
/ 24 июня 2010

wc -L или wc --max-line-length вычисляет и отображает длину самой длинной строки на входе (может быть недоступно во всех версиях wc).


При максимальной длине строкив некоторой переменной (скажем, $max), запустите

while read line
do
    printf "%-${max}s\n" $line
done < in.txt > out.txt
0 голосов
/ 07 октября 2015

Вы можете объединить свои оригинальные идеи:

awk '{ if (length($0) > max){max = length($0)} } END { print max }' in.txt

awk 'length <= 50 { printf "%-50s\n",$0 }' in.txt

Используйте переменную оболочки для передачи результата от одного сценария к другому, используя awk's-v разбор аргументов

MAX=$(awk '{ if (length($0) > max){max = length($0)} } END { print max }' in.txt)

awk -v max=$MAX 'length <= max { printf "%-"max"sX\n",$0 }' in.txt

ИЛИ вы можете заменить жестко запрограммированную 50 заменой команды оболочки $(), чтобы создать этоуродливый однострочный зверь:

awk -v max=$(awk '{ if (length($0) > max){max = length($0)} } END { print max }' in.txt) 'length <= max { printf "%-"max"s\n",$0 }' in.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...