उत्तर
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 line-rebuild):
यह ध्यान रखना दिलचस्प है कि इसके बीच का अंतर:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
वे क्रमशः उपज देते हैं
hello awk world
hello awk world
के प्रासंगिक अनुभाग (gawk का) मैनुअल केवल एक अलग रूप में के रूप में कहा गया है कि awk जब आप एक क्षेत्र बदलने (विभाजक के आधार पर, आदि) $ 0 के पूरे के पुनर्निर्माण के लिए जा रहा है। मुझे लगता है कि यह पागल व्यवहार नहीं है। यह इस है:
"अंत में, ऐसे समय होते हैं जब फ़ील्ड और ओएफएस के वर्तमान मूल्य का उपयोग करके, पूरे रिकॉर्ड को फिर से बनाने के लिए जाग को मजबूर करना सुविधाजनक होता है। ऐसा करने के लिए, उचित रूप से अहानिकर असाइनमेंट का उपयोग करें:"
$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