reorganizando linhas em uma tabela usando awk [closed]

0

Eu tenho uma tabela com várias centenas de linhas:

a1 
a2 
a3 
a4 
b1 
b2 
b3 
b4 
c1 
c2 
c3 
c4
... etc.

Quero devolvê-lo na seguinte ordem:

a1
b1
c1
d1
a2
b2
c2
d2
a3
b3
c3

O script abaixo funciona para selecionar o primeiro bloco de linhas:

$ awk '{if(NR==1||NR%4==1)print}'

Mas como posso fazer um loop para fazer isso em todo o arquivo?

    
por kate 24.08.2018 / 01:14

2 respostas

1

Você pode usar sort para fazer a classificação. Especificamente, você pode dizer a sort para fazer uma classificação geral, g , que lida com a classificação de letras e números. Podemos controlar qual caractere na string que queremos fazer a classificação, informando sort usando a notação X.Y em vez da notação X,Y mais típica.

Por exemplo:

$ sort -k1.2g file
a1
b1
c1
a2
b2
c2
a3
b3
c3
a4
b4
c4

Opções de classificação:

  -k, --key=KEYDEF
          sort via a key; KEYDEF gives location and type
  -g, --general-numeric-sort
         compare according to general numerical value

  KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where F is
  a field number and C a character  position in the field; both are origin 1,
  and the stop position defaults to the line's end.  If neither -t nor -b is 
  in effect, characters in a field are counted from the beginning of the 
  preceding whitespace.  OPTS is one or  more  single-letter ordering options
  [bdfgiMhnRrV],  which  override  global ordering options for that key.  If 
  no key is given, use the entire line as the key.
    
por 24.08.2018 / 01:28
0

Se a "etapa" for sempre pequena (no seu caso, 4), então, uma maneira rápida e não-inteligente poderia ser simplesmente ler o arquivo várias vezes e selecionar os registros em cada deslocamento - por exemplo,

awk 'FNR==1 {k++} !((FNR-k)%4)' file file file file
a1 
b1 
c1 
a2 
b2 
c2 
a3 
b3 
c3 
a4 
b4 
c4

ou, equivalentemente, usando o GNU Awk (com sua regra BEGINFILE ):

gawk 'BEGINFILE{k++} !((FNR-k)%4)' file file file file
    
por 24.08.2018 / 01:45

Tags