arquivo de ordenação, mas mantenha pares de linhas juntos

2

Eu tenho um arquivo com entradas da estrutura

a1;b1;c1;
d1;e1;f1;g1
a2;b2;c2;
d2;e2;f2;g2

Eu quero classificar este arquivo através do g, mas manter o abc com o g correspondente. Existe alguma maneira legal de fazer isso através da linha de comando? Tudo o que posso pensar agora é escrever um script perl mais ou menos elaborado.

    
por fifaltra 09.12.2015 / 06:12

2 respostas

3

Se as suas linhas estiverem garantidas em pares com três campos no primeiro e quatro no segundo (e a segunda linha contiver o valor "g"):

$ sed -n 'N;s/\n//;p' your_file \
   | sort -t';' -k7 \
   | perl -F';' -ane '$,=";";print @F[0..2],"\n";print @F[3..$#F]'

A parte sed une-se a cada duas linhas consecutivas, sort classifica a entrada no sétimo campo delimitado por ; e finalmente a perl divide cada linha em 2: uma com três campos e uma com quatro.

    
por 09.12.2015 / 07:05
2

Assumindo a estrutura homogênea dos dados, você pode usar o GNU sed e o GNU awk para realizar isso, por exemplo:

# Separate records by an extra new-line
sed '2~2G' infile |

# Read records and use GNU awk's built-in sort on field 7
awk '
  BEGIN { PROCINFO["sorted_in"] = "@ind_str_desc" }
  { h[$7] = $0 }
  END { for(k in h) print h[k] }
' RS= FS='[;\n]+'

Saída:

a2;b2;c2;
d2;e2;f2;g2
a1;b1;c1;
d1;e1;f1;g1
    
por 16.12.2015 / 09:49

Tags