Câu trả lời
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
Hoặc, để thực hiện phân loại phụ ban đầu (có thể không chủ ý) của bất kỳ dòng có độ dài bằng nhau:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
Trong cả hai trường hợp, chúng tôi đã giải quyết vấn đề đã nêu của bạn bằng cách di chuyển khỏi awk cho lần cắt cuối cùng của bạn.
Các dòng có độ dài phù hợp - phải làm gì trong trường hợp hòa:
Câu hỏi không xác định có muốn sắp xếp thêm hay không cho các dòng có độ dài phù hợp. Tôi đã giả định rằng điều này là không mong muốn và đề nghị sử dụng -s
( --stable
) để ngăn chặn các dòng như vậy được sắp xếp với nhau và giữ chúng theo thứ tự tương đối mà chúng xảy ra trong đầu vào.
(Những người muốn kiểm soát nhiều hơn việc sắp xếp các mối quan hệ này có thể xem xét --key
tùy chọn sắp xếp .)
Tại sao giải pháp cố gắng của câu hỏi không thành công (awk line-dựng lại):
Thật thú vị khi lưu ý sự khác biệt giữa:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Họ mang lại năng suất tương ứng
hello awk world
hello awk world
Phần có liên quan của sổ tay (gawk's) chỉ đề cập đến một khía cạnh mà awk sẽ xây dựng lại toàn bộ $ 0 (dựa trên dấu phân cách, v.v.) khi bạn thay đổi một trường. Tôi đoán đó không phải là hành vi điên rồ. Nó có cái này:
"Cuối cùng, có những lúc thuận tiện để buộc awk xây dựng lại toàn bộ hồ sơ, sử dụng giá trị hiện tại của các trường và OFS. Để làm điều này, hãy sử dụng phép gán dường như vô hại:"
$1 = $1 # force record to be reconstituted
print $0 # or whatever else with $0
"Lực lượng này awk để xây dựng lại hồ sơ."
Kiểm tra đầu vào bao gồm một số dòng có độ dài bằng nhau:
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