Reformate cada seqüência de duas linhas em duas colunas

5

Eu gostaria de marcar minha impressão:

1 2
3 4
5 6
7 8

para

1 2 5 6
3 4 7 8

Como ajustá-lo usando uma linha de comando simples ( awk ou sed ) ??

    
por user60294 13.02.2014 / 13:45

5 respostas

6

Uma maneira seria usar awk e paste :

paste -sd'\t' <(awk 'NR%2' inputfile) <(awk '!(NR%2)' inputfile)

A ideia é obter linhas pares e ímpares separadamente e paste .

Para sua entrada, produziria:

1 2 5 6
3 4 7 8
    
por 13.02.2014 / 13:54
6

com sed :

sed 'N;N;N;s/\n\(.*\)\n\(.*\n\)/  /'
    
por 13.02.2014 / 15:21
2

Aqui está outra maneira com awk :

$ cat file
1 2
3 4
5 6
7 8

$ awk 'NR%2 { even[++x] = even[x] ? even[x] FS $0 : $0 ; next }
            { odd[++y] = odd[y] ? odd[y] FS $0 : $0 }
       END  { printf "%s\n%s\n", even[x], odd[y] }' file
1 2 5 6
3 4 7 8
    
por 14.02.2014 / 03:03
2

Aqui está um jeito Perl:

perl -ne 's/\n/ / if $.%2!=0; print' file 

Ele simplesmente substitui o caractere de gráfico de nova linha ( \n ) por um espaço em linhas ímpares. Executar nos seus dados, produz:

$ perl -ne 's/\n/ / if $.%2!=0; print' file 
1 2 3 4
5 6 7 8
    
por 14.02.2014 / 16:06
0

Solução na linguagem TXR :

Ingênuo:

@(repeat)
@a @b
@c @d
@e @f
@g @h
@(output)
@a @b @e @f
@c @d @g @h
@(end)
@(end)

Executar:

$ txr reshape.txr -
1 2
3 4
5 6
7 8
1 2 5 6
3 4 7 8
A B
C D
E F
G H
A B E F
C D G H

Problema: consome dados que não têm a "forma" correta. Esta versão recai sobre consumir e imprimir uma linha se não houver correspondência para a forma de bloco de oito elementos que está sendo transformada.

@(repeat)
@  (cases)
@a @b
@c @d
@e @f
@g @h
@    (output)
@a @b @e @f
@c @d @g @h
@    (end)
@  (or)
@line
@    (do (put-line line))
@  (end)
@(end)
$ cat data
foo

a l
m o
s t
!
# $
% ^
* (
@ +

bar
$ txr reshape8.txr data
foo

a l
m o
s t
!
# $ * (
% ^ @ +

bar

Apenas no caso de a questão realmente significar que pares consecutivos de linhas são feitos adjacentes, o código seria modificado assim:

@(repeat)
@  (cases)
@a
@b
@    (output)
@a @b
@    (end)
@  (or)
@line
@    (do (put-line line))
@  (end)
@(end)
    
por 14.02.2014 / 03:25