शामिल हों: "क्रमबद्ध क्रम में फ़ाइल 2 नहीं"


13

मुझे दो फाइलें मिली हैं _jeter3.txt और _jeter1.txt

मैंने जाँच की है कि वे दोनों 20 वें कॉलम का उपयोग कर हल कर रहे हैं sort -c

sort -t '     ' -c -k20,20 _jeter3.txt
sort -t '     ' -c -k20,20 _jeter1.txt
#no errors

लेकिन एक त्रुटि है जब मैं joinदोनों फ़ाइलों को यह कहना चाहता हूं कि दूसरी फ़ाइल को सॉर्ट नहीं किया गया है:

join -t '   ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order

मुझे समझ नहीं आता क्यों।

cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0

अद्यतन : ' sort -f' और join -i(दोनों मामले असंवेदनशील) का उपयोग करके समस्या को हल करता है। लेकिन यह मेरी प्रारंभिक समस्या की व्याख्या नहीं करता है।

अद्यतन : सॉर्ट और शामिल होने के संस्करण:

> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

क्या आप हमें संपूर्णता के लिए "ज्वाइन --version" और "सॉर्ट --version" का आउटपुट दे सकते हैं? मुझे किसी भी परिस्थिति में उस त्रुटि संदेश को देने के लिए गन्नू के कुछ पुराने संस्करण नहीं मिल सकते हैं।
ब्रूस एडिगर

3
कृपया कुछ नमूना डेटा पोस्ट करें जो समस्या और उत्पादन को प्रदर्शित करता है locale
गिलेस एसओ- बुराई को रोकना '10

जवाबों:


25

मुझे उबंटू 11.04 के साथ sortऔर joinसंस्करण (GNU कोरुटिल्स) 8.5 में दोनों के साथ एक ही त्रुटि मिली ।

वे स्पष्ट रूप से असंगत हैं। वास्तव में sortकमांड खराब लगती है: -f( --ignore-case) विकल्प के साथ या इसके बिना कोई अंतर नहीं है। जब छँटाई, aaBहमेशा से पहले है aBa। गैर अल्फ़ान्यूमेरिक वर्णों को भी हमेशा अनदेखा किया जाता है ( abcपहले है ab-x)

सम्मिलित होने के लिए विपरीत उम्मीद है ... लेकिन मेरे पास एक समाधान है

वास्तव में, यह कोलाज अनुक्रम से जुड़ा हुआ है: LANG=en_EN sort -k 1,1 <myfile> ...तब LANG=en_EN join ...संदेश का उपयोग करना समाप्त हो जाता है।

अंतर्राष्ट्रीयकरण बुराई की जड़ है ... (कोई भी इसे स्पष्ट रूप से दस्तावेज नहीं करता है)।


तो, अगर दोनों का उपयोग करते हैं LANG=en_EN, तो यह निश्चित रूप से काम करेगा? क्या यह किसी भी लोकेल के लिए काम करेगा, जब तक कि दोनों एक ही लोकेल का उपयोग न करें? हम कह सकते हैं कि बीच का अंतर sortऔर joinहै कि वे डिफ़ॉल्ट रूप से एक अलग स्थान का उपयोग है?
एरॉन मैकडैड

क्या -kविकल्प यहाँ उत्तर है, या यह है LANG=en_EN? यह स्पष्ट नहीं है कि सटीक समाधान यहां क्या है।
उपयोगकर्ता

5

क्या आप संख्याओं के साथ छंटनी कर रहे थे? मैंने पाया कि मेरे द्वारा इस मुद्दे को हल करने पर जो कॉलम मैं शामिल कर रहा था, उस पर शून्य-पैडिंग।

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt

5

यदि आप सुनिश्चित हैं कि आपने अपनी इनपुट फ़ाइलों को ठीक से क्रमबद्ध किया है और उनकी रेखाओं को जोड़ा जा सकता है, तो आप चलकर उपरोक्त त्रुटि से बच सकते हैं join --nocheck-order file1.txt file2.txt


4

sort डिफ़ॉल्ट रूप से कुंजी के रूप में पूरी लाइन का उपयोग करता है

join कुंजी के रूप में केवल निर्दिष्ट फ़ील्ड का उपयोग करता है।

जिस कुंजी को आप जुड़ना चाहते हैं, उसका उपयोग करने के लिए आपको इस असंगतता को रोकना होगा।

ज्वाइन मैन पेज स्टेट्स:

महत्वपूर्ण: FILE1 और FILE2 को सम्मिलित फ़ील्ड पर सॉर्ट किया जाना चाहिए। उदाहरण के लिए, 'Sort -k 1b, 1' का उपयोग करें, यदि 'join' में कोई विकल्प नहीं है। ध्यान दें, तुलना 'LC_COLLATE' द्वारा निर्दिष्ट नियमों का सम्मान करती है। यदि> इनपुट सॉर्ट नहीं किया गया है और कुछ लाइनें शामिल नहीं हो सकती हैं, तो एक चेतावनी संदेश दिया जाएगा।


2
LOCALE=C sort ...
LOCALE=C join ...

इससे आपकी समस्या दूर हो जाएगी। @Michael द्वारा बताया गया मुद्दा, कोलाजेशन अनुक्रम है, जो आपकी LOCALE सेटिंग पर निर्भर करता है।


2

ध्यान दें कि यदि आपको यह त्रुटि दिखाई देती है, और आप पहले से ही एक विशिष्ट कॉलम पर हल कर चुके हैं और दीवार के खिलाफ अपना सिर पीट रहे हैं, जैसे -k4,4 तो आपको सॉर्ट कमांड के लिए विभाजक सेट करना पड़ सकता है

जाहिरा तौर पर ओपी ने पहले ही यह -t '' के साथ किया था, लेकिन एक सामान्य टैब से अलग पाठ के लिए मैं सुझाऊंगा

sort -t $'\t' ...

सॉर्ट कमांड कुछ अलग से डिफ़ॉल्ट रूप से रिक्त स्थान को समाहित कर सकती है, यहां तक ​​कि एक टैब से अलग फाइल की तरह दिखने वाली चीज़ पर भी (विशेषकर यदि आपके द्वारा छांटे जा रहे कॉलम के अंदर रिक्त स्थान हैं)।

फिर यदि आपने उस सॉर्ट किए गए डेटा को शामिल होने के लिए पास कर दिया है, और आपके पास है

join -t $'\t' ...

इसके बाद यह समाप्त हो जाता है कि त्रुटि संदेश इसके बारे में अनसर्टेड है। जैसा कि ऊपर उल्लेख किया गया है, शामिल नहीं हो सकता है -t '' हालांकि।


1

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

और मैं गाइल्स के साथ सहमत हूं, नमूना डेटा मददगार होगा।

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