Відповідь
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
"Це змушує відновити запис".
Тестовий вхід, включаючи рядки однакової довжини:
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