Cevap
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
Veya, herhangi bir eşit uzunlukta çizginin orijinal (belki de kasıtsız) alt sıralamasını yapmak için:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
Her iki durumda da, belirtilen kesintinizi son kesintiniz için awk'den uzaklaşarak çözdük.
Eşleşen uzunluk çizgileri - kravat durumunda ne yapmalı:
Soru, eşleşen uzunluktaki satırlar için daha fazla sıralama istenip istenmediğini belirtmedi. Bunun istenmeyen olduğunu varsaydım ve bu tür çizgilerin birbirine göre sıralanmasını önlemek için -s
( --stable
) kullanımını önerdim ve girişte göründükleri sırayla saklayın.
(Bu bağları sıralama konusunda daha fazla kontrol isteyenler sıralama --key
seçeneğine bakabilirler .)
Sorunun girişim çözümü neden başarısız oluyor (awk hat yeniden oluşturma):
Arasındaki farkı not etmek ilginçtir:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Sırasıyla verim verirler
hello awk world
hello awk world
İlgili bölümü (gawk en) manuel yalnızca bir alan değiştirdiğinizde awk (vb ayırıcı dayanarak) 0 $ tüm yeniden edeceğini bir kenara olarak bahseder. Sanırım bu çılgın bir davranış değil. Şuna sahiptir:
"Son olarak, alanların ve OFS'nin geçerli değerini kullanarak awk'yi tüm kaydı yeniden oluşturmaya zorlamanın uygun olduğu zamanlar vardır. Bunu yapmak için, görünüşte zararsız atamayı kullanın:"
$1 = $1 # force record to be reconstituted
print $0 # or whatever else with $0
Diyerek şöyle devam etti: "Bu, awk'ı kaydı yeniden oluşturmaya zorluyor."
Eşit uzunlukta bazı çizgiler içeren test girişi:
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