যোগদান: "ফাইল 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.
(...)

আপনি কেবলমাত্র সম্পূর্ণতার জন্য "join --version" এবং "सॉर्ट - রূপান্তর" এর আউটপুট দিতে পারেন? যে কোনও পরিস্থিতিতে আমাকে ত্রুটি বার্তা দেওয়ার জন্য আমি কিছু পুরানো সংস্করণ gnu পেতে পারি না।
ব্রুস এডিগার

3
দয়া করে কিছু নমুনা ডেটা পোস্ট করুন যা সমস্যাটি এবং এর আউটপুট প্রদর্শন করে locale
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


25

আমি উবুন্টু 11.04 এর সাথে একই সংস্করণ পেয়েছি sortএবং joinউভয় সংস্করণে (জিএনইউ কোর্টিলস) 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 বাছাই করা উচিত। উদাহরণস্বরূপ, 'সাজান-কে 1 বি, 1' ব্যবহার করুন> 'জয়েন' এর কোনও বিকল্প নেই। দ্রষ্টব্য, তুলনাগুলি 'LC_COLLATE' দ্বারা নির্দিষ্ট বিধি সম্মান করে। যদি> ইনপুটটি বাছাই না করা হয় এবং কয়েকটি লাইন যোগ দেওয়া যায় না, একটি সতর্কতা বার্তা দেওয়া হবে।


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

এই আপনার সমস্যার সমাধান হবে। @ মিশেল দ্বারা চিহ্নিত হিসাবে ইস্যুটি হ'ল কোলেশন ক্রম, যা আপনার লকএল সেটিংয়ের উপর নির্ভর করে।


2

মনে রাখবেন যে আপনি যদি এই ত্রুটিটি দেখে থাকেন এবং আপনি ইতিমধ্যে নির্দিষ্ট কলামে বাছাই করেছেন এবং প্রাচীরের বিরুদ্ধে আপনার মাথাটি পিটছেন যেমন সাজান-কে 4,4, তবে আপনার বাছাই আদেশের জন্য পৃথককারীও স্থাপন করতে হবে

স্পষ্টতই ওপি '-t' 'দিয়ে ইতিমধ্যে এটি করেছে তবে সাধারণ ট্যাব দ্বারা পৃথক করা পাঠ্যের জন্য আমি সুপারিশ করব

sort -t $'\t' ...

সারণি কমান্ডটি কোনও ট্যাব দ্বারা পৃথক করা ফাইলের মতো দেখতে (ডিফল্টরূপে পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক ফাইলের জন্য অন্তর্ভুক্ত করতে পারে (বিশেষত যদি আপনি সাজানোর ক্ষেত্রে কলামের ভিতরে ফাঁকা স্থান রয়েছে))।

তারপরে আপনি যদি যোগ করার জন্য সেই সাজানো ডেটাটি পাস করে থাকেন এবং আপনার কাছে

join -t $'\t' ...

তারপরে এটির ত্রুটি বার্তাকে অরসোর্টড হওয়ার কারণে এটি শেষ হয়। উপরে উল্লিখিত হিসাবে, যোগদান যদিও এটি গ্রহণ করতে পারে না ''।


1

যুক্তির পরে যুক্ত হওয়ার জন্য একটি চরিত্র। সাজানোর জন্য আপনি একটি দীর্ঘতর সাজানোর বিভাজক সরবরাহ করতে পারেন। আমি মনে করি যে আপনি যে আলাদা ক্ষেত্রটি চান তা ফাইলগুলিতে যোগ দিতে পারেন এবং মামলাটিকে উপেক্ষা করে কাকতালীয়ভাবে সমস্যার সমাধান করে।

এবং আমি গিলসের সাথে একমত, সেই নমুনা ডেটা সহায়ক হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.