Classificação de registros por campo para trás (não de cima para baixo)

2

Eu tenho um pequeno script que faz um monte de montagem em preparação para backup, ou que apenas mostra todas as partições atualmente montadas. Eu fiz isso para classificar a saída em vários critérios, a saída parcial abaixo classifica por rótulo de partição:

Label              Filesystem       Size  

[a2--0-boot]       /dev/sda2        179M  
[a8--2-home]       /dev/sda8        2.0G  
[a9--1-var]        /dev/sda9        996M  
[b2--1-boot]       /dev/sdb2       1008M  
[b11-2-home]       /dev/sdb11       2.0G  
[b14-2-var]        /dev/sdb14       2.0G  

... No entanto, seria útil poder classificar os rótulos das partições de trás para frente, note que não quero dizer 'de cabeça para baixo', quero dizer assim:

[a8--2-home]       /dev/sda8        2.0G  
[b11-2-home]       /dev/sdb11       2.0G  
[a9--1-var]        /dev/sda9        996M  
[b14-2-var]        /dev/sdb14       2.0G  
[a2--0-boot]       /dev/sda2        179M  
[b2--1-boot]       /dev/sdb2       1008M  

... O motivo é simplesmente que os rótulos das partições de origem e das partições de destino possuem os mesmos 'términos', mas iniciam de forma diferente devido a estarem em discos diferentes e possuírem números de partições diferentes. e metas em conjunto, que seriam convenientes.

(FWIW, 'a8--2-home' significa partição '/ dev / sda8', cerca de 2GB de tamanho e montado como '/ home'.)

Eu tentei tudo o que posso pensar e passei horas procurando por respostas, mas sem sorte até agora. Isso pode ser feito? 'Sort' parece incapaz de retirá-lo. Em particular, o parâmetro '-r' fornece uma listagem 'invertida', mas não o tipo 'para trás' que estou procurando.

    
por Ray Andrews 20.01.2014 / 02:11

4 respostas

2

Como alternativa, você pode classificar a parte do primeiro campo que começa no deslocamento 8:

$ sort -k1.8 < file
[a2--0-boot]       /dev/sda2        179M
[b2--1-boot]       /dev/sdb2       1008M
[a8--2-home]       /dev/sda8        2.0G
[b11-2-home]       /dev/sdb11       2.0G
[a9--1-var]        /dev/sda9        996M
[b14-2-var]        /dev/sdb14       2.0G

Se o seu sistema tiver um comando rev , você pode fazer:

$ rev < file | sort -k3 | rev
[b11-2-home]       /dev/sdb11       2.0G
[a8--2-home]       /dev/sda8        2.0G
[a9--1-var]        /dev/sda9        996M
[b14-2-var]        /dev/sdb14       2.0G
[a2--0-boot]       /dev/sda2        179M
[b2--1-boot]       /dev/sdb2       1008M

Para reverter apenas o primeiro campo:

rev1() {
  sed -e 's/^/\
/;:1' -e 's/\(.*\n\)\([^[:blank:]]\)//;t1' -e 's/\n//'
}
rev1 < file | sort | rev1
    
por 20.01.2014 / 12:28
1

Use rev para reverter as linhas. Use o awk para imprimir a terceira coluna primeiro. Use a classificação para classificar, use o corte para remover a primeira coluna novamente e use rev para reverter as linhas novamente:

tweedleburg:~ # rev test | awk '{printf $3;printf " ";print}'| sort|cut -d " " -f 2-|rev
[a8--2-home]       /dev/sda8        2.0G  
[b11-2-home]       /dev/sdb11       2.0G  
[a9--1-var]        /dev/sda9        996M  
[b14-2-var]        /dev/sdb14       2.0G  
[a2--0-boot]       /dev/sda2        179M  
[b2--1-boot]       /dev/sdb2       1008M 

link

    
por 20.01.2014 / 08:05
1

Solução de Perl:

# !/usr/bin/perl

while (<>) {
    push @r, [ $_, split /\s+/, $_ ];
}

map { print $_->[0] }
sort { (reverse $a->[1]) cmp (reverse $b->[1]) }  
@r;

Os dados estão sendo lidos de stdin no loop while e preparados para a Transformação Schwartziana .
 As últimas 3 linhas são uma instrução.

    
por 20.01.2014 / 02:59
0

Obrigado pessoal, mas acho que o meu é o melhor:

cat inputfile | rev | sort -k7 |rev

Doente e torcida, mas funciona muito bem. Tho me pergunto por que isso não funciona:

tac inputfile | sort -k7 | rev
    
por 20.01.2014 / 17:04