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
.
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?
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
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 } <>;
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="")
Tags text-processing sort