2010-09-30 13 views
19

द्वारा पाठ फ़ाइल को सॉर्ट करें मेरे पास ~ 300k पंक्तियों वाली एक टेक्स्ट फ़ाइल है। प्रत्येक पंक्ति में अल्पविराम-सीमित क्षेत्रों की एक अलग संख्या होती है, जिसमें से अंतिम संख्यात्मक गणना की जाती है। मैं इस अंतिम संख्यात्मक क्षेत्र से फ़ाइल को सॉर्ट करना चाहता हूं। मैं नहीं कर सकता:बैश: अंतिम फ़ील्ड मान

sort -t, -n -k 2 file.in > file.out 

प्रत्येक पंक्ति में फ़ील्ड की संख्या स्थिर नहीं है। मुझे लगता है कि sed, शायद जवाब शायद, लेकिन यकीन नहीं कैसे। E.g:

awk -F, '{print $NF}' file.in 

मुझे अंतिम कॉलम मान देता है, लेकिन फ़ाइल को सॉर्ट करने के लिए इसका उपयोग कैसे करें?

उत्तर

27

संख्यात्मक कुंजी को सामने रखने के लिए अजीब का उपयोग करें। $NF वर्तमान रिकॉर्ड का अंतिम क्षेत्र है। क्रमबद्ध करें। डुप्लिकेट कुंजी को हटाने के लिए sed का उपयोग करें।

awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //' 
+6

कोई पुनर्निर्देशन की आवश्यकता नहीं है। 'awk -F,' {प्रिंट $ एनएफ, $ 0} 'yourfile' – ghostdog74

0

शायद सॉर्ट करने से पहले फ़ाइल में प्रत्येक पंक्ति के फ़ील्ड को उलट देता है?

perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")' | 
    sort -t, -n -k1 | 
    perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")' 

ऐसा करना चाहिए, जब तक कॉमा को किसी भी तरह से उद्धृत नहीं किया जाता है। यदि यह एक पूर्ण सीएसवी फ़ाइल है (जिसमें कॉमा को बैकस्लैश या स्पेस के साथ उद्धृत किया जा सकता है) तो आपको एक वास्तविक सीएसवी पार्सर चाहिए।

2
vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q' 
+1

'ex' का प्रयोग क्यों न आप उस मार्ग से जाने के लिए जा रहे हैं? Vim वैसे भी 'ex' से उस विशेष कार्यक्षमता हो जाता है। –

+0

'ex'' -e' विकल्प के साथ, 'vim' है। वास्तव में इस मामले में कोई फर्क नहीं पड़ता। – Benoit

+0

'ex' काफी समय से' vim' (और 'vi') को पूर्ववत करता है। 'vim' में 'ex' इम्यूलेशन मोड हो सकता है, लेकिन इससे यह' ex' नहीं बनता है। –

0

पर्ल एक लाइनर:

@lines=<STDIN>;foreach(sort{($a=~/.*,(\d+)/)[0]<=>($b=~/.*,(\d+)/)[0]}@lines){print;} 
0

मैं (और मैं काम करने के लिए awk नहीं मिल सका) एक विकल्प के रूप में यहाँ मेरा फेंकने के लिए जा रहा हूँ :)

नमूना फ़ाइल :

Call of Doody       1322 
Seam the Ripper       1329 
Mafia Bots 1       1109 
Chicken Fingers       1243 
Batup Light        1221 
Hunter F Tomcat       1140 
Tober         0833 

कोड:

for i in `sed -e 's/.* \(\d\)*/\1/' file.txt | sort`; do grep $i file.txt; done > file_sort.txt 
0

अजगर एक लाइनर:

python -c "print ''.join(sorted(open('filename'), key=lambda l: int(l.split(',')[-1])))" 
संबंधित मुद्दे