Responda
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
Ou, para fazer sua sub-classificação original (talvez não intencional) de qualquer linha de igual comprimento:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
Em ambos os casos, resolvemos o seu problema declarado, afastando o awk para o seu corte final.
Linhas de comprimento correspondente - o que fazer em caso de empate:
A pergunta não especificou se era necessária uma classificação adicional para linhas de comprimento correspondente. Eu assumi que isso é indesejável e sugeri o uso de -s
( --stable
) para impedir que essas linhas sejam classificadas uma contra a outra e mantenha-as na ordem relativa em que elas ocorrem na entrada.
(Aqueles que desejam mais controle sobre a classificação desses vínculos podem procurar a --key
opção de classificação .)
Por que a tentativa de solução da pergunta falha (awk line-reconstruction):
É interessante notar a diferença entre:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Eles produzem respectivamente
hello awk world
hello awk world
A seção relevante do manual (gawk's) menciona apenas um aparte que o awk reconstruirá todo o valor de US $ 0 (com base no separador, etc.) quando você alterar um campo. Eu acho que não é um comportamento louco. Tem o seguinte:
"Finalmente, há momentos em que é conveniente forçar o awk a reconstruir todo o registro, usando o valor atual dos campos e do OFS. Para fazer isso, use a atribuição aparentemente inócua:"
$1 = $1 # force record to be reconstituted
print $0 # or whatever else with $0
"Isso força o awk a reconstruir o registro."
Entrada de teste, incluindo algumas linhas de igual comprimento:
aa A line with MORE spaces
bb The very longest line in the file
ccb
9 dd equal len. Orig pos = 1
500 dd equal len. Orig pos = 2
ccz
cca
ee A line with some spaces
1 dd equal len. Orig pos = 3
ff
5 dd equal len. Orig pos = 4
g