সারি হিসাবে একাধিক লাইনের সাহায্যে পাঠ্য ফাইলগুলি বাছাই করুন


14

এই ফর্ম্যাটটিতে আমার কাছে একটি পাঠ্য ফাইল রয়েছে:

####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY3
VAL31
VAL32
VAL33
VAL34

আমি এই ফাইলটি KEYলাইন অনুসারে বাছাই করতে চাই এবং এর সাথে পরবর্তী 4 টি লাইন রাখি যাতে ফলস্বরূপ বাছাই করা উচিত:

####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34

এই কাজ করতে একটি উপায় আছে কি ?


5
পোস্টটি অতিক্রম করবেন না দয়া করে
Zanna

@ জান্না: আমি মনে করি ইউনিক্স এবং অ্যাসুবুন্টু বিভাগগুলির জন্য একটি বর্জন আছে কারণ এই দুটিটির প্রত্যেকেই প্রচুর পরিমাণে ওভারল্যাপ করে! আমি মনে করি আমি ইউনিক্সের মেটা বিভাগে এটি সম্পর্কে পড়েছি
আরওয়াইএন

2
প্রাসঙ্গিক মেটা প্রশ্নটি এইউ মোডের মাধ্যমে এখানে জিজ্ঞাসা করা হয়েছে :) জিজ্ঞাসা উবুন্টুকে ক্রস-পোস্ট করা প্রশ্নগুলি কীভাবে পরিচালনা করা উচিত?
জান্না

@ আরওয়াইএন সমস্যাটি ওভারল্যাপের মতো হবে না, বাস্তবে অনেকগুলি এসই সাইট ওভারল্যাপ হয়ে গেছে, তবে উত্তর দেওয়ার লোকেরা অন্য সাইটে উত্তরগুলি সম্পর্কে না জেনে থাকতে পারে।
পিএইচকে

উত্তর:


13

msort(1)মাল্টি-লাইন রেকর্ডের সাথে ফাইলগুলি বাছাই করতে সক্ষম হওয়ার জন্য ডিজাইন করা হয়েছিল। এটিতে একটি alচ্ছিক গুই রয়েছে, পাশাপাশি একটি সাধারণ এবং ব্যবহারযোগ্য মানুষের জন্য কমান্ড লাইন সংস্করণ রয়েছে। (কমপক্ষে, যে সমস্ত মানুষ ম্যানুয়াল সাবধানে পড়তে এবং উদাহরণগুলি সন্ধান করতে পছন্দ করে ...)

আফিকা, আপনি রেকর্ডগুলির জন্য একটি স্বেচ্ছাসেবী প্যাটার্ন ব্যবহার করতে পারবেন না, সুতরাং যদি না আপনার রেকর্ডগুলি নির্দিষ্ট আকারের হয় (বাইটগুলিতে, অক্ষর বা লাইন নয়)। রেকর্ডগুলির জন্য msortএকটি -bবিকল্প রয়েছে যা ফাঁকা রেখার দ্বারা পৃথক করা লাইনের ব্লক।

আপনি নিজের ইনপুটটিকে এমন বিন্যাসে রূপান্তর করতে পারেন যা -bখুব সহজেই কাজ করবে প্রত্যেকের আগে একটি ফাঁকা রেখা রেখে ###...(প্রথমটি বাদে)।

ডিফল্টরূপে, এটি স্ট্যাডারের উপর পরিসংখ্যান মুদ্রণ করে, তাই কমপক্ষে এটি কখন সারণ করা হয় তা বলা সহজ কারণ এটি ভেবেছিল পুরো ইনপুটটি একক রেকর্ড।


msortআপনার তথ্য কাজ করে। sedকমান্ড প্রত্যেক করার একটি newline prepends #+লাইন 1. ছাড়া লাইন -wপ্রকারের পুরো রেকর্ড (lexicographically)। কী হিসাবে রেকর্ডের কোন অংশটি ব্যবহার করা যায় তা বেছে নেওয়ার বিকল্প রয়েছে, তবে আমার সেগুলির দরকার নেই।

আমি অতিরিক্ত নিউলাইনগুলি সরিয়েও রেখেছি।

$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null 
####################################
KEY1
VAL11
VAL12
VAL13
VAL14

####################################
KEY2
VAL21
VAL22
VAL23
VAL24

####################################
KEY3
VAL31
VAL32
VAL33
VAL34

-r '#'রেকর্ড বিভাজক হিসাবে এটি ব্যবহার করার জন্য আমার কোনও ভাগ্য হয়নি । এটি ভেবেছিল পুরো ফাইলটি একটি রেকর্ড।


আপনাকে অনেক ধন্যবাদ; msortখুব দরকারী; ধন্যবাদ ( -rএটি সম্পর্কে মনে হয় কারণ এটি একাধিক # আমি ব্যবহার করেছি -dএবং এটি কাজ করেছে
RYN

শান্ত! (+1 টি) msort -qwr '#' ex আমার জন্য (। ভাল এটা আউটপুট Rec chages বিভাজক) কাজ করে
JJoao

9

একটি সমাধান হ'ল প্রথমে একটি ব্লকের ভিতরে লাইন ফিডগুলি আপনার পছন্দের অব্যবহৃত অক্ষরে (নীচে উদাহরণে '|') পরিবর্তন করা, ফলাফলটি বাছাই করা এবং নির্বাচিত বিভাজকটিকে মূল লাইন ফিডে ফিরিয়ে আনা:

sed -e 'N; N; N; N; N; s/\n/|/g' file.txt \
| sort -k2,2 -t\| \
| sed 's/|/\n/g'

1
ধন্যবাদ; এটি কাজ করে কিন্তু বিশেষত খুব নোংরা হয় যখন ডেটাও নোংরা হয়! যদি চাবিটির পরে রেখাগুলি 100 হয় তবে আমার ;Nসেখানে 100 টি রাখা দরকার এবং পাঠ্যটিতে নিজেই ব্যবহৃত না এমন একটি চরিত্র খুঁজে পাওয়া শক্ত হয়ে যেতে পারে; sortবা awk, ...
মাল্টলাইন

5
perl -0ne 'print sort /(#+[^#]*)/g' file.txt
  • perl -0 পুরো ফাইল slurps
  • /(....)/g মেলে এবং রেকর্ড নিষ্কাশন
  • print sort ... বাছাই করুন এবং তাদের মুদ্রণ

2

এখানে আরও একটি উপায় যা একটি KEYবিভাগে কয়েকটি সংখ্যক লাইনের সাথে কাজ করা উচিত :

# extract delimiter
delim=$(head -n1 <infile)
sed '/#/d;/KEY/h;G;s/\n/\x02/' infile | nl -ba -nrz -s $'\002' | sort -t $'\002' -k3 -k1,1 |
cut -d $'\002' -f2 | sed '/KEY/{x;s/.*/'"${delim}"'/;G}'

এটি ডিলিমিটারটিকে একটি ভেরিয়েবলে সংরক্ষণ করে কাজ করে (তারপরে এটি ইনপুট থেকে সরানোর জন্য)। এরপরে এটি পৃথক পৃথক হিসাবে KEY*কম অ্যাস্কি চর (যা আপনার nইনপুটটিতে আসার সম্ভাবনা নেই) ব্যবহার করে এর সাথে সম্পর্কিত বিভাগে প্রতিটি লাইনে যুক্ত হয় এবং তারপরে lএকই বিভাজকটি ব্যবহার করে সমস্ত ইনসকে আবদ্ধ করে। এটি কেবল তখনই sort3 য় এবং 1 ম ক্ষেত্রের দ্বারা যুক্ত হওয়া এবং cutমাঝের কলামটি বেঁধে রাখা এবং তারপরে একটি ফাইনালের মাধ্যমে বিভাজকদের পুনরুদ্ধার করার বিষয় sed। মনে রাখবেন যে উপরের সাথে, আপনার প্রয়োজন অনুসারে কমান্ডটি সামঞ্জস্য করার KEY12আগে বাছাই করা হবে।KEY2sort


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