यूनिक्स के साथ अल्पविराम-सीमांकित फ़ाइल में संख्यात्मक रूप से क्रमबद्ध करना


8

मुझे एक अल्पविराम से अलग की गई फ़ाइल मिली है जो इस तरह दिखाई देती है:

100,00869184
6492,8361
1234,31
200,04071

मैं sortइस फ़ाइल को केवल पहले कॉलम द्वारा संख्यात्मक रूप से सॉर्ट करने के लिए उपयोग करना चाहता हूं ।

वांछित परिणाम:

100,00869184
200,04071
1234,31
6492,8361

मैं इस प्रकार का उपयोग करके कैसे प्राप्त करूं? ऐसा लगता है जैसे अल्पविराम के बजाय हजारों विभाजकों के साथ ऐसा व्यवहार किया जा रहा है जब मैं उन्हें इस तरह से बाहर बुलाता हूं।

दोनों sort -t',' -nऔर sort -t',' -nk1'मुझे यह दे:

1234,31
200,04071
6492,8361
100,00869184

डिफ़ॉल्ट के आधार पर छाँटना (कोई पैरामीटर नहीं) या उपयोग करने sort -t','से मुझे यह मिलता है:

100,00869184
1234,31
200,04071
6492,8361

और एक संख्या के रूप में sort -nछाँटना मुझे यह देता है:

1234,31
200,04071
6492,8361
100,00869184

मैं अपना वांछित परिणाम प्राप्त करने के लिए किस प्रकार का उपयोग कर सकता हूं?

जोड़ने के लिए संपादित: यह लगभग 7 मिलियन लाइनों की क्रमबद्ध सूची बनाने के लिए एक बार के ऑपरेशन के लिए है, इसलिए वर्कअराउंड या अन्य अपरंपरागत तरीके पूरी तरह से स्वीकार्य हैं।


मैं यहाँ जो उदाहरण देख रहा हूँ, -tवह -tइस चरित्र और चरित्र के बीच की जगह के रूप में विकल्प दिखाते हैं
SeanC

पहले सोचा - कट का उपयोग करें। यह दिए गए विभाजक के आधार पर केवल एक विशेष कॉलम का चयन करता है। इसके अलावा "Artem बर्फ" tr के साथ जवाब है। मुझे tr से प्यार है। मैं यह लिखने और परीक्षण करने के लिए बहुत आलसी हूं, हालांकि। चीयर्स!
वोरैक

टैब चार के लिए एक ही संभव: stackoverflow.com/questions/1037365/…
Ciro Santilli 审查

जवाबों:


9

यह निश्चित रूप से एक गंदा काम है, लेकिन मैंने स्थानीय लोगों के बारे में @ slhck की टिप के लिए यह धन्यवाद करने का एक तरीका निकाला। अगर कोई बेहतर जवाब आता है, तो यह दूसरों के लिए अधिक उपयोगी होगा, मैं निश्चित रूप से इसे स्वीकार करूंगा क्योंकि यह केवल मेरी विशिष्ट समस्या के लिए काम करता है।

मैंने लोकेल को स्पैनिश (बोलिवियन) में सेट किया, ताकि कॉमा को दशमलव अंक की तरह माना गया, फिर मानक संख्यात्मक छंटनी ने चाल चली।

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361

आह, मैंने एक जर्मन लोकेल या इसी तरह का उपयोग करने का सुझाव दिया है। यह परीक्षण करने में सक्षम होने के बिना या आपके पास कौन से उपकरण उपलब्ध हैं, इसके बारे में अभी कुछ और नहीं सोचा जा सकता, क्योंकि यह एक बहुत ही दुर्लभ यूनिक्स संस्करण है।
slhck

@slhck मुझे लगता है कि UNIX में फंसने वाली अधिकांश समस्याओं का एक कारण है :) मुझे एक समाधान में लाने में आपकी मदद के लिए धन्यवाद, परवाह किए बिना।
dpatchery

6

GNU sortडिफ़ॉल्ट रूप से ऐसा करता है:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

संस्करण:

$ gsort --version
sort (GNU coreutils) 8.19

हालाँकि, एक चेतावनी है: यदि आपकी छँटाई अपेक्षा के अनुरूप काम नहीं करती है, तो आपका localeशायद कुछ अलग करने के लिए तैयार है C। ऐसा क्यों है? localeअक्षरों, संख्याओं, दशमलव वर्णों वगैरह की छंटाई और व्याख्या को परिभाषित करता है।

इसे जांचने के लिए, बस localeएक टर्मिनल में प्रवेश करें । के लिए LC_NUMERICसेट है en_US.UTF-8, हो सकता है? यह गलत क्रम क्रम की व्याख्या करेगा। इसे वापस सेट करें C:

export LC_NUMERIC=C

फिर, अपने sortआदेश को फिर से आज़माएं । आप अपने वैश्विक सेट करना चाहते हैं localeके लिए C, के साथ ऐसा कर:

export LC_ALL=C

मेरे पास अपने वातावरण में GNU तक पहुँच नहीं है। क्या यह कुछ ऐसा है जिसे मैं आसानी से प्राप्त कर सकता हूं जब मैं समाप्त कर दूंगा? HMU चैट में अगर कोई मुझे ऐसा करने में मदद करना चाहेगा ... मैं काफी UNIX नौसिखिया हूँ।
dpatchery

मुझे पूरा यकीन है कि यह सिर्फ एक localeमुद्दा है। लेकिन sort --versionवास्तव में आपके लिए क्या है ?
slhck

सॉर्ट --version मुझे एक अवैध तर्क देता है। --आदेशों ने मेरे लिए अतीत में काम नहीं किया है। मैंने मैन पेज की जाँच की और स्पष्ट रूप से कोई संस्करण नहीं मिला है, लेकिन यह "HP-UX 11i संस्करण 2: अगस्त 2003" को सूचीबद्ध करता है, यदि यह बिल्कुल मदद करता है। मेरा LC_NUMERIC "C" पर सेट है।
dpatchery

उदाहरण के लिए जर्मन लोकेल ,एक दशमलव विभाजक के रूप में उपयोग करेगा । हालांकि मैंने कभी भी एचपी-यूएक्स का उपयोग नहीं किया है।
slhck

1

उस -gविकल्प को जोड़ने का प्रयास करें, जो संख्यात्मक छँटाई करने के लिए माना जाता है।

प्रयत्न:

sort -t',' -g <whatever>

क्या -nसंख्यात्मक छँटाई नहीं है ? -जी मुझे गैरकानूनी विकल्प देता है।
dpatchery

-gहै general-numeric-sortविकल्प और वास्तव में से किसी हाल के संस्करण में उपलब्ध होना चाहिए sort। @dpatchery
16

यह मेरे काम की जगह पर है इसलिए मेरे पास निश्चित रूप से हाल ही में संस्करण नहीं है :)
dpatchery

0

परिधि को बदलें:

cat commafile | tr , " " | sort -n 

- आपकी मदद करनी चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.