Ответ
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
Или, чтобы выполнить исходную (возможно, непреднамеренную) подсортировку любых строк одинаковой длины:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
В обоих случаях мы решили указанную вами проблему, отказавшись от awk для окончательной версии.
Линии одинаковой длины - что делать в случае галстука:
В вопросе не указывалось, требуется ли дальнейшая сортировка для строк одинаковой длины. Я предположил, что это нежелательно, и предложил использовать -s
( --stable
), чтобы предотвратить сортировку таких строк друг против друга и сохранить их в относительном порядке, в котором они встречаются во входных данных.
(Те, кто хочет большего контроля над сортировкой этих связей, могут рассмотреть --key
вариант сортировки .)
Почему попытка решения вопроса не удается (восстановление строки awk):
Интересно отметить разницу между:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Они соответственно уступают
hello awk world
hello awk world
В соответствующем разделе руководства (gawk) упоминается только в стороне, что awk собирается перестроить весь $ 0 (на основе разделителя и т.д.), когда вы изменяете одно поле. Думаю, это не безумное поведение. В нем есть:
«Наконец, бывают случаи, когда удобно заставить awk перестроить всю запись, используя текущее значение полей и OFS. Для этого используйте, казалось бы, безобидное присваивание:»
$1 = $1
print $0
«Это заставляет awk восстановить запись».
Тестовый ввод, включающий несколько строк одинаковой длины:
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