Risposta
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
Oppure, per eseguire il tuo sotto-ordinamento originale (forse non intenzionale) di qualsiasi linea di uguale lunghezza:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
In entrambi i casi, abbiamo risolto il problema dichiarato allontanandoci da awk per il tuo taglio finale.
Linee di lunghezza corrispondente: cosa fare in caso di pareggio:
La domanda non specificava se si desiderasse o meno un ulteriore ordinamento per le linee di lunghezza corrispondente. Ho supposto che ciò sia indesiderato e ho suggerito l'uso di -s
( --stable
) per impedire che tali linee vengano ordinate l'una contro l'altra e mantenerle nell'ordine relativo in cui si verificano nell'input.
(Coloro che desiderano un maggiore controllo sull'ordinamento di questi legami potrebbero guardare --key
all'opzione sort .)
Perché la soluzione tentata della domanda ha esito negativo (ricostruzione di riga awk):
È interessante notare la differenza tra:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Rendono rispettivamente
hello awk world
hello awk world
La sezione pertinente del manuale di (gawk) menziona solo a parte che awk ricostruirà l'intero $ 0 (basato sul separatore, ecc.) Quando cambi un campo. Immagino che non sia un comportamento folle. Ha questo:
"Infine, ci sono momenti in cui è conveniente forzare Awk a ricostruire l'intero record, usando il valore corrente dei campi e OFS. Per fare questo, usa l'assegnazione apparentemente innocua:"
$1 = $1 # force record to be reconstituted
print $0 # or whatever else with $0
"Questo costringe Awk a ricostruire il disco."
Test input che include alcune linee di uguale lunghezza:
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