एक पाइप के साथ लाइनों को नहीं छाँटना '' | सही ढंग से इसमें


17

मैं कुछ सरल पाइप-सीमांकित डेटा को सॉर्ट करने का प्रयास कर रहा हूं। हालाँकि, वास्तव में सॉर्ट नहीं है। यह मेरी हेडर पंक्ति को नीचे तक ले जाता है, लेकिन 241 से शुरू होने वाली मेरी दो पंक्तियों को 24 से शुरू होने वाली पंक्ति से विभाजित किया जा रहा है।

cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376

sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c

कॉलम हेडर को फ़ाइल के निचले भाग में ले जाया जा रहा है, इसलिए सॉर्ट इसे स्पष्ट रूप से संसाधित कर रहा है। लेकिन, वास्तविक मूल्यों को छाँटा नहीं जा रहा है जैसे मैं उम्मीद कर रहा था।

इस मामले में मैंने इसके साथ काम किया

sort sort_fail.csv --field-separator='|' -k1,1

लेकिन, मुझे लगता है कि यह आवश्यक नहीं होना चाहिए। छंटनी क्यों नहीं हो रही है?


2
उपयोग करें LC_COLLATE=C sort। आप क्या उम्मीद कर रहे हैं पर निर्भर करता है, आप भी आवश्यकता हो सकती हैLC_COLLATE=C sort -t'|' -n
mosvy

3
"Csv शैली" डेटा सॉर्ट करने के लिए आप उपयोग कर सकते हैं csvsortसे csvkitहै, जो ठीक से उद्धृत मूल्यों हैंडल।
बाकूरी

जवाबों:


32

sort स्थानीय जानकारी है, इसलिए आपके LC_COLLATE सेटिंग (जो LANG से विरासत में मिली है) के आधार पर आपको अलग-अलग परिणाम मिल सकते हैं:

$ LANG=C sort sort_fail.csv 
241|212|20810378
241|213|20810376
24|121|2810172
column_a|column_b|column_c

$ LANG=en_US sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c

इससे लिपियों में समस्या हो सकती है, क्योंकि आपको पता नहीं हो सकता है कि कॉलिंग लोकेल क्या सेट है, और इसलिए अलग-अलग परिणाम मिल सकते हैं।

स्क्रिप्ट को सेटिंग की आवश्यकता के लिए बाध्य करना असामान्य नहीं है

जैसे

$ grep 'LC.*sort' /bin/precat
      LC_COLLATE=C sort -u | prezip-bin -z "$cmd: $2"

अब क्या दिलचस्प है, यहाँ, |चरित्र अजीब लग रहा है।

ऐसा इसलिए है क्योंकि en_US के लिए डिफ़ॉल्ट नियम, जो आईएसओ से निकला है, कहते हैं

$ grep 007C /usr/share/i18n/locales/iso14651_t1_common
<U007C> IGNORE;IGNORE;IGNORE;<j> # 142 |

जिसका मतलब है कि |चरित्र को नजरअंदाज किया गया है और क्रम ऐसा होगा जैसे कि चरित्र मौजूद नहीं है।

$ tr -d '|' < sort_fail.csv | LANG=C sort
24121220810378
241212810172
24121320810376
column_acolumn_bcolumn_c

और वह "अप्रत्याशित" से मेल खाता है जिसे आप देख रहे हैं।

आस-पास का काम -n(संख्यात्मक प्रकारों को बाध्य करने के लिए), या क्षेत्र विभाजक (जैसा आपने किया) का उपयोग करना या Cलोकेल का उपयोग करना है ।


चित्त आकर्षण करनेवाला। मैंने स्थानीयकरण के बारे में कुछ अन्य हिट देखे, लेकिन लगा कि यह 24 बनाम 241 के सापेक्ष क्रम को प्रभावित करेगा, ऐसा कुछ नहीं।
user10777668

7
जीएनयू में अतिरिक्त उपयोगी कुछ प्रकार है --debugविकल्प है, जो कुंजी (रेखांकित) की तुलना करने के लिए प्रयोग किया जाता इंगित करता है
जेफ स्कालर

--debug के साथ चलने से पूरी लाइन पूरी तरह से रेखांकित हो जाती है - पाइप वर्ण सहित, यह सिर्फ स्थानीयकरण के कारण कोई प्रभाव नहीं डालने के लिए निर्धारित है। यह एक अच्छी विशेषता है, लेकिन इस मामले में मेरी मदद नहीं की (मैंने कोशिश की :)
user10777668

ठीक यही कारण है कि मैंने इसका उल्लेख किया, @ user10777668 - यह इंगित करता है sortकि हम जो मान लेते हैं उसे रोकने के बजाय पूरी पंक्ति का उपयोग कर रहे हैं।
जेफ स्कालर

मैं इसे रोकने की उम्मीद नहीं कर रहा था। मैं इसे पाइप के चरित्र को पहचानने और उस प्रकार में शामिल करने की उम्मीद कर रहा था, इसलिए 24 | 1 और 241 का अलग-अलग तरीके से इलाज किया गया। मुझे यकीन नहीं है कि कैसे --debug ने इसे बदल दिया होगा, और वास्तव में यह देखते हुए कि यह रेखांकित करता है | ऐसा लगता है कि यह वास्तविक समस्या से सक्रिय रूप से विचलित हो गया है, जहां स्थानीयकरण के कारण पाइप चरित्र का अंतर्ग्रहण हो गया है
user10777668

1

मुझे क्या चिढ़ है कि 24दोनों के बीच अपनी जगह से नहीं हटता 241। दूसरा क्षेत्र ए से शुरू होता है 14दूसरे क्षेत्र में अग्रणी के साथ इस तरह की कोशिश कर 24रहा है, नीचे ले जाया गया है, इसलिए मुझे संदेह है sortकि |जब तक अन्यथा नहीं बताया जाता है। प्रयास करें sort -n...


1

-n, --numeric- प्रकार स्ट्रिंग संख्यात्मक मान के अनुसार तुलना करते हैं

210
23

-N के बिना, पाठ से 210 23 से आगे है क्योंकि यह चरित्र मेरे चरित्र को जाता है।


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