Use sed ou awk para unir linhas em um determinado padrão?

6

Não tenho certeza sobre como transformar essa entrada:

A
B
C
apartner
bpartner
cpartner

para esta saída:

A apartner
B bpartner
c cpartner

Eu tenho esse padrão em um arquivo de 80 linhas que precisa ser de 40 linhas. Além disso, como posso colocar cada item, digamos, em <il><b>A</b> <i>apartner</i></il> ?

    
por mirandalol 13.06.2013 / 00:21

2 respostas

8

Usando pr de coreutils :

pr -2 -t -l 40 -s' ' $oldfile > $newfile

Adicione tags usando os mesmos pr e sed :

pr -2 -t -l 40 -J -S'</b> <i>' $oldfile | sed 's|^|<il><b>|;s|$|</i></il>|' > $newfile

saída:

<il><b>A</b> <i>apartner</i></il>
<il><b>B</b> <i>bpartner</i></il>
<il><b>C</b> <i>cpartner</i></il>
    
por 13.06.2013 / 01:17
5

[GNU]

Se não for importante usar sed ou awk , recomendo isso como a solução mais fácil:

Primeiro você divide o arquivo em dois:

head -n 40 file >file1
tail -n 40 file >file2

Então você combina as linhas:

paste --delimiters=" " file1 file2

Em vez de head e tail , você pode usar sed ou awk , é claro:

sed -n -e 1,40p combinedfile >file1
sed -n -e 41,80p combinedfile >file2
awk 'NR < 41 {print;}' combinedfile >file1
awk 'NR > 40 {print;}' combinedfile >file2

OK, acabei de perceber: a solução awk pura não é tão complicada quanto eu pensava:

awk 'NR < 41 { lines[NR]=$0; next; }; {print lines[NR-40],$0}' combinedfile
    
por 13.06.2013 / 00:49