Répondre
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
Ou, pour faire votre sous-tri original (peut-être involontaire) de toutes les lignes de longueur égale:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
Dans les deux cas, nous avons résolu votre problème déclaré en nous éloignant de awk pour votre coupe finale.
Lignes de longueur correspondante - que faire en cas d'égalité:
La question ne précisait pas si un autre tri était souhaité ou non pour les lignes de longueur correspondante. J'ai supposé que c'était indésirable et j'ai suggéré l'utilisation de -s
( --stable
) pour éviter que de telles lignes soient triées les unes par rapport aux autres, et les conserver dans l'ordre relatif dans lequel elles apparaissent dans l'entrée.
(Ceux qui veulent plus de contrôle sur le tri de ces liens pourraient envisager l' --key
option de tri .)
Pourquoi la tentative de solution de la question échoue (reconstruction de ligne awk):
Il est intéressant de noter la différence entre:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Ils cèdent respectivement
hello awk world
hello awk world
La section pertinente du manuel de (gawk) mentionne seulement en aparté que awk va reconstruire la totalité de $ 0 (basé sur le séparateur, etc.) lorsque vous modifiez un champ. Je suppose que ce n'est pas un comportement fou. Il a ceci:
"Enfin, il y a des moments où il est pratique de forcer awk à reconstruire l'intégralité de l'enregistrement, en utilisant la valeur actuelle des champs et OFS. Pour ce faire, utilisez l'affectation apparemment anodine:"
$1 = $1 # force record to be reconstituted
print $0 # or whatever else with $0
"Cela oblige awk à reconstruire le disque."
Entrée de test comprenant quelques lignes de même longueur:
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