Как выровнять столбец в текстовом файле

HTTP 1.1 требует, чтобы Вы отправили, по крайней мере, a Host заголовок в ПОЛУЧАЕТ запросы. Таким образом, минимальный легальный запрос похож на это:

GET http://www.example.com/noise/and/junk HTTP/1.1
Host: www.example.com

(Плюс дополнительный CRLF для завершения раздела заголовка, конечно.)

Могут быть серверы HTTP, которые справятся с запросом, утверждающим потребовать HTTP 1.1, но это не включает a Host заголовок, но Ваш сервер корректен для отклонения такого запроса.

Host расширение HTTP 1.1, которое было необходимо для поддержки основанного на имени виртуального хостинга. Если сайт, к которому Вы пытаетесь получить доступ, имеет выделенные серверы (или по крайней мере, специализированный IP), можно безопасно ронять к HTTP 1.0, который позволяет Вам сделать однострочный Запрос HTTP:

GET http://www.example.com/noise/and/junk HTTP/1.0

4
07.08.2014, 18:55
6 ответов

Одно использование решения perl:

Содержание script.pl:

use warnings;
use strict;

## Acept one argumnet, the input file.
@ARGV == 1 or die qq[Usage: perl $0 input-file\n];

while ( <> ) {
        ## Remove last '\n' char.
        chomp;

        ## Split line with string 'ASDFASDF22'
        my @f = split /(ASDFASDF22)/;

        ## Print line but print first 49 chars plus a space of the special string.
        printf qq[%s%-50s%s\n],
                join( qq[], @f[0,1] ),
                substr( $f[2], 0, 49 ) . qq[ ],
                join( qq[], @f[3..$#f] );
}

Выполните сценарий:

perl script.pl infile

И вывод:

1653455 ASDFASDF22 bla bla bla asd xmv                              ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase          ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl w ASDFASDF22 BB
5
27.01.2020, 20:50
  • 1
    omg. этот ответ является большим! –  LanceBaynes 22.12.2011, 20:51

Используя массивы удара

while read -r -a words; do
    prefix="${words[0]} ${words[1]}"
    idx=${#words[*]}
    suffix="${words[$((idx-2))]} ${words[$((idx-1))]}"
    unset words[0] words[1] words[$((idx-2))] words[$((idx-1))]
    middle="${words[*]}"
    printf "%s %-50s %s\n" "$prefix" "${middle:0:50}" "$suffix"
done < filename
2
27.01.2020, 20:50
  • 1
    Хороший. read -r обычно рекомендуется по плоскости read. –  jw013 22.12.2011, 22:17
  • 2
    Спасибо. Я также пропустил -a опция. –  glenn jackman 22.12.2011, 22:31
f=open("filename","r") 

a=[]

for line in f:

    if line[-1:]=='\n':
        line=line[:-1]

    a=line.split("ASDFASDF22")

    a.insert(1,"ASDFASDF22")

    a.insert(len(a)-1,"ASDFASDF22")

    k1=len(a[2])

    if k1 > 50:
        k2=k1-50
        k2=k2+1
        a[2]=a[2][:-k2]
        for i in a:
            print i,
    else:
        k2=50-k1
        for i in range(0,len(a)):
            if i !=2:
                print a[i],
            else:
                for j in range(0,k2):
                    a[2]=a[2]+" "
                print a[2],
    print ""`

Это - наивная реализация в Python. Сохраните это как filename.py и дайте python filename.py.

0
27.01.2020, 20:50

Я пробовал скрипт @Birei на текстовом файле, который мне нужно было колонтифицировать, но он провалился, потому что в файле было несколько строк, которые не соответствовали заданному разделителю (и их не нужно было колонтифицировать). Поэтому, с моим плохим знанием perl, я добавил простую проверку размера массива, чтобы избежать обработки несовпадающих строк. Я выложу здесь основной код на случай, если кому-то понадобится это изменение.

use warnings;
use strict;

## Acept one argumnet, the input file.
@ARGV == 1 or die qq[Usage: perl $0 input-file\n];

while ( <> ) {
    ## Remove last '\n' char.
    chomp;

    ## Split line with string 'ASDFASDF22'
    my @f = split /(ASDFASDF22)/;

    my $f = @f;
    # check array size to avoid errors on non-matching lines
    if ($f > 1)
    {
        ## Print line but print first 49 chars plus a space of the special string.
        printf qq[%s%-50s%s\n],
                join( qq[], @f[0,1] ),
                substr( $f[2], 0, 49 ) . qq[ ],
                join( qq[], @f[3..$#f] );

   }
   else
   {
       # output non-matching line as-is
       print $_ . qq[\n];
   }
}

Итак, в качестве примера вывода:

1653455 ASDFASDF22 bla bla bla asd xmv                              ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase          ASDFASDF22 BB
######################### non-matching line left alone ##########################
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl w ASDFASDF22 BB
1
27.01.2020, 20:50

GNU awk:

awk -F "[[:space:]]+ASDFASDF22[[:space:]]+" \
    'BEGIN { OFS=" ASDFASDF22 "; }
    { 
        $2 = sprintf("%-50s", substr($2, 0, 50));
        print;
    }'
0
27.01.2020, 20:50
while read -r one two line
do  printf "%s %s %-50.50s% %s\n" \   
       "$one" "$two" "${line%%"$two"*}" "$two${line#*"$two"}"         
done <<\DATA
1653455 ASDFASDF22 bla bla bla asd xmv ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl wqe ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl wqe hjbiub kuvyukvbklhb khuvbukvbuybouin ASDFASDF22 BB
DATA

Вы можете сделать это с большинством любой оболочки POSIX.

ВЫХОД

1653455 ASDFASDF22 bla bla bla asd xmv                                ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase            ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl wqe ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl wqe ASDFASDF22 BB
0
27.01.2020, 20:50

Теги

Похожие вопросы