ตอบ
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's)กล่าวถึงเฉพาะส่วนที่ 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