Antworten
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
Oder um Ihre ursprüngliche (möglicherweise unbeabsichtigte) Untersortierung von Zeilen gleicher Länge durchzuführen:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
In beiden Fällen haben wir Ihr angegebenes Problem gelöst, indem wir uns für Ihren endgültigen Schnitt von awk entfernt haben.
Linien gleicher Länge - was bei Krawatte zu tun ist:
In der Frage wurde nicht angegeben, ob eine weitere Sortierung für Zeilen mit übereinstimmender Länge gewünscht wurde oder nicht. Ich habe angenommen, dass dies unerwünscht ist, und die Verwendung von -s
( --stable
) vorgeschlagen, um zu verhindern, dass solche Zeilen gegeneinander sortiert werden, und sie in der relativen Reihenfolge zu halten, in der sie in der Eingabe vorkommen.
(Diejenigen, die mehr Kontrolle über das Sortieren dieser Bindungen wünschen, könnten sich die --key
Option der Sortierung ansehen .)
Warum der Lösungsversuch der Frage fehlschlägt (Aufbau einer awk-Leitung):
Es ist interessant, den Unterschied zwischen:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Sie ergeben jeweils
hello awk world
hello awk world
In dem entsprechenden Abschnitt des Handbuchs von (gawk) wird nur erwähnt, dass awk die gesamten $ 0 (basierend auf dem Trennzeichen usw.) neu erstellt, wenn Sie ein Feld ändern. Ich denke, es ist kein verrücktes Verhalten. Es hat dies:
"Schließlich gibt es Zeiten, in denen es zweckmäßig ist, awk zu zwingen, den gesamten Datensatz unter Verwendung des aktuellen Werts der Felder und des OFS neu zu erstellen. Verwenden Sie dazu die scheinbar harmlose Zuweisung:"
$1 = $1 # force record to be reconstituted
print $0 # or whatever else with $0
"Dies zwingt awk, den Datensatz neu zu erstellen."
Testeingabe einschließlich einiger Zeilen gleicher Länge:
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