LINUX.ORG.RU

Обработка текстового файла

 , ,


1

3

Всем добра. Возникла очень острая необходимость сделать следующую штуку. Думаю делать или на Perl, или на Bash. Допустим, есть файл такого содержания:

Line       Col1     Col2     Col3       Col4

LINE0      A1       1        1          1
           B2       2        2          1
           C1       25       25         1

LINE1      A3       7        9          1
           B5       19       12         1
           C5       144      20         1

LINE2      A86      17        9         1
           B0       100      19         1
           C94      4        25         1

И как из него выдернуть первый, второй и третий столбец (Col1,Col2 и Col3), и оформить их следующим образом?

(
LINE0
A1,1
B2,2
C1,25
)

(
LINE1
A3,7
B5,19
C5,144
)

(
LINE2
A86,17
B0,100
C94,4
)

Ответ на: комментарий от MKuznetsov

для таких целей - awk

Конечно это замечательно, но как реализовать это? Разве awk сможет прочитать файл, обработать, и сохранить в новый файл?

S9 ()

на скорую руку

perl -alne 'next if $.==1; if(!length){print ")" if $.>2; next} print @F>4 ? "(\n$F[0]\n$F[1],$F[2]" : "$F[0],$F[1]"' file.txt > newfile.txt

Deleted ()
Ответ на: комментарий от S9

Кэп на связи

может любая программочччка, у которой читает из stdin и пишет в stdout.

mos ★★☆☆☆ ()
Ответ на: комментарий от Deleted

Пятёрка. Давайте вашу зачётку!

А на awk так можешь? Вроде похоже должно быть.

anonymous ()

на bash в лоб это то-же за пару минут пишется

quest ★★★★ ()
Ответ на: комментарий от quest

ну и где?)

Вы (упомянувшие здесь awk/bash) скор набиваете, чтоль?

Deleted ()
#!/usr/bin/awk -f

NR == 1 { next }

NF > 4  { printf "(\n%s\n%s,%s\n", $1, $2, $3 }
NF == 4 { printf "%s,%s\n", $1, $2 }
NF == 0 { print ")" }
annulen ★★★★★ ()
Ответ на: комментарий от annulen

Можно сделать более устойчиво к данным на входе, но мне лень.

annulen ★★★★★ ()
Ответ на: комментарий от S9

Это надо записать в файл prg.awk :

{ if( NR>2 ) {
 i=(NR-3)%4;
 if(i==0)
  printf "(\n%s\n%s,%s\n",$1,$2,$3;
 else if(i==1 || i==2)
  printf "%s,%s\n",$1,$2;
 else
  print ")\n";
} }
Предположим исходные данные в файле data_in.txt . Результат будем записывать в файл data_out.txt .

Запускать так :

awk -f prg.awk data_in.txt >data_out.txt

А чо в Саратове все такие красивые ?

anonymous ()
python -c "import sys;print '\n\n'.join(('(\n%s\n%s\n)' % (s[0].pop(0), '\n'.join('%s,%s' % (ss[0], ss[1]) for ss in s))) for s in zip(*[map(str.split, filter(None, map(str.strip, open(sys.argv[1]).readlines()[1:])))[i::3] for i in range(3)]))" input.txt > output.txt
pawnhearts ★★★★★ ()
Ответ на: комментарий от annulen

Класс!

А printf обязательно? Обычным «принтом» нельзя обойтись?

...

Во, у меня так сократилось:

tail -n +3 file.txt | awk 'NF==5 {print "(\n"$1"\n"$2","$3} NF==4 {print $1","$2} NF==0 {print ")\n"}'

anonymous ()
Ответ на: комментарий от pawnhearts

Может сходишь подлечишься?

fmt = '''(
%s
%s,%s
%s,%s
%s,%s
)
'''

for line in open('file.txt').read().split('\n\n')[1:]:
    s = line.split()
    print(fmt % (*s[:3], *s[5:7], *s[9:11]))

Попроси, кстати, у доктора, чтобы третий питон тебе прописал.

anonymous ()
Ответ на: комментарий от anonymous
perl -alnE '$"=",",say$.<3?next:!$_?")\n":@F>4?"(\n@F[0]\n@F[1,2]":"@F[0,1]"'

вообще, и в разреженном виде короче, но я ужал, чтоб уже не играться :-D

Deleted ()
Ответ на: комментарий от Deleted
awk -vRS='\n\n' -vn=\\n -vC=, 'NR>1{print"("n$1n$2C$3n$6C$7n$10C$11n")"n}' :]

:] — имя входного файла

Кто-нибудь с APL/J/K? Если там это возможно.

anonymous ()
Ответ на: комментарий от anonymous

-4 символа

perl -alE'$"=",",say$_?@F>4?"(\n$F[0]\n@F[1,2]":"@F[0,1]":")\n"if$.>2'

;-D

Deleted ()
Ответ на: -4 символа от Deleted

Re: -4 символа

(ノಠ益ಠ)ノ彡┻━┻

anonymous ()
Ответ на: комментарий от Deleted

ну и где?)

а нафига? на perl вон уже есть, а на чистом bash в лоб оно пишется за пару минут через read, но выглядит тупо.

quest ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.