Ответ
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 # force record to be reconstituted
print $0 # or whatever else with $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