Ordenar linhas por número de palavras por linha

14

Dado entrada:

hello: world foo bar baz
bar:
baz: bin boop bop fiz bang beep
bap: bim bam bop
boatkeeper: poughkeepsie

Eu gostaria de classificá-lo na maioria das palavras no topo, pelo menos no final, assim:

baz: bin boop bop fiz bang beep
hello: world foo bar baz
bap: bim bam bop
boatkeeper: poughkeepsie
bar:

Como eu faria isso com sort ou alguma outra ferramenta?

    
por Caleb Xu 23.08.2015 / 03:22

4 respostas

22

Você pode fazer algo como:

awk '{print NF,$0}' file | sort -nr | cut -d' ' -f 2-

Usamos awk para prefixar o número de campos em cada linha. Em seguida, sort desse número e removê-lo com cut .

    
por 23.08.2015 / 03:38
6

Em% GNU awk , é possível usar a matriz PROCINFO para definir muitos parâmetros internos, incluindo a ordem na qual os elementos da matriz são impressos (controlados pelo elemento "sorted_in" ). Assim, podemos construir e matriz indexada com o valor de NF" "NR , quais elementos têm valor de $0 e imprimi-lo na saída desejada, no seu caso, que seria "@ind_num_desc" :

awk '{a[NF" "NR]=$0}END{PROCINFO["sorted_in"]="@ind_num_desc"; for(i in a) print a[i]}' file
    
por 23.08.2015 / 04:07
5

One-liner Perl:

print sort { split(' ',$a) <=> split(' ',$b) } <>;

Se você quiser quebrar os laços usando ordem alfabética:

print sort { split(' ',$a) <=> split(' ',$b) or $a cmp $b } <>;
    
por 23.08.2015 / 19:50
4

Através do python.

s = '''hello: world foo bar baz
bar:
baz: bin boop bop fiz bang beep
bap: bim bam bop'''.splitlines()
for i in sorted(s, key=lambda x: len(x.split()), reverse=True):
    print(i)

ou

with open('/path/to/the/input/file') as f:
    m = f.readlines()
    for i in sorted(m, key=lambda x: len(x.split()), reverse=True):
        print(i, end="")
    
por 23.08.2015 / 13:05