কোনও ফাইলের মাঝামাঝি থেকে বাইটগুলি কীভাবে বের করবেন?


1

আমরা কয়েকটি বড় ইডিআই ফাইল পার্স করছি যাতে সিআর / এলএফ থাকে না। তবে সেগমেন্ট ডিলিমিটার হিসাবে তাদের কাছে ~( টিলডে ) আছে ।

আমি ফাইলটির জন্য নিয়ন্ত্রণ রেকর্ডটি বের করার চেষ্টা করছি এবং আমার 120 এমবি ফাইলের শেষ বাইটগুলি দেখতে এরকম কিছু দেখাচ্ছে:

~REF*1L*0711882~SE*62300*39093~GE*1*500001242~IEA*1*500001241~

ফাইলে একটি মাত্র নিয়ন্ত্রণ রেকর্ড রয়েছে এবং এটি সর্বদা শুরু হয় ~SE

সুতরাং, সিআরএলএফ রূপান্তর করা এবং ফাইলের শেষ তিনটি লাইনটি ব্যতীত এসই * 62300 * 39093 বিভাগটি পেতে এই ফাইলটি কাটাতে স্ট্যান্ডার্ড ইউনিক্স কাট , অ্যাজক , গ্রেপ , ইত্যাদি সরঞ্জামগুলি ব্যবহার করার কি সহজ উপায় আছে ~?

দাবি
অস্বীকার : আমি কোনও ইউনিক্স গুরু নই, সুতরাং উত্তরটি কোনও অভিজ্ঞ ব্যবহারকারীর কাছে সুস্পষ্ট হতে পারে। এছাড়াও, ফাইল ফর্ম্যাটটিতে আমার কোনও নিয়ন্ত্রণ নেই।


~নতুন লাইনে রূপান্তর করা এবং ফাইলের শেষ 3 লাইনগুলি টেলিংয়ে কী সমস্যা ? যদি ফাইলটি ইতিমধ্যে নিউলাইনগুলিকে অন্তর্ভুক্ত না রাখার জন্য পরিচিত হয় তবে এটি বিন্যাসের মধ্যে কোনও অস্পষ্টতার পরিচয় দেয় না এবং সত্যি বলতে গেলে ফাইলটিকে এমন বিন্যাসে ম্যাসেজ করার সেরা উপায় যা এই সমস্ত লাইন-ভিত্তিক সরঞ্জামগুলির সাথে কাজ করা সহজ করে তোলে।
সেলেদা

@ কেলাডা: আমি কোনও ইউনিক্স ব্যক্তি নই, তবে শেষ 100 বা এরকম অক্ষর বের করতে কয়েকশ মেগাবাইটকে রূপান্তর করা কেবল ওভারকিলের মতো মনে হয়; এর মধ্যে কয়েকটি ফাইল খুব বড় হতে পারে এবং আমি এটি করার সবচেয়ে সহজ উপায়টি খুঁজছি।
নোহ

আপনি ব্যবহার করে কোনও ফাইলের শেষ কয়েকটি লাইনে ফিল্টার করতে পারেন tail। এগুলি পার্স করার দরকার নেই। এর মতো কিছু tail edi_file | grep ~SE | cut -d'~' -f 3(যেখানে এডিআইফাইল আপনার বড় ফাইলের নাম) (অস্বীকৃতি: প্রয়োজনীয় ক্ষেত্রটি কেবলমাত্র ক্ষেত্র # 3 এ কাজ করে যদি (by 'র দ্বারা বি-ডি হিসাবে বিস্মৃত হয় That তবে এটি সামঞ্জস্য করতে পারে we ~আমরা আরও বড় আকার পেতে পারি? ইনপুট ফাইলের উদাহরণ?
হেনেস

120 এমবি এত বড় নয়। কেউ কখনও শেল স্ক্রিপ্টের বাইরে প্রতিটি শেষ বিট কর্মক্ষেত্র চেপে ধরে নিয়ে উদ্বিগ্ন হননি। যদি আপনি এটি চান, সি :-) ব্যবহার করুন সুতরাং মাইকেল কোহনের উত্তরটি আমি যা করবো তা বেশ কার্যকর। অথবা যদি পুরো জিনিসটি আপনার কাছে পড়তে চান তবে ফাইলটি যদি খুব বড় হয় তবে এর আগে এমন কোনও কিছু দিয়ে এটি পূর্ব-ফিল্টার করুন tail --bytes=5000 ding... এবং তারপরে আপনি আশা করেন যে আপনার প্রয়োজন যে তিনটি লাইন অন্তর্ভুক্ত করার জন্য শেষ 5000 বাইট যথেষ্ট enough
সেলেদা

একবার বন্ধ জিনিস জন্য। আমি রাজী. এটি চালানো যাক। প্রতিদিন ব্যবহৃত কোনও কিছুর জন্য আমি কেবলমাত্র লেজ পার্স করতে পছন্দ করি। উভয়ই এটি অপচয়কারী নয় এবং কারণ এটি অযথা অপব্যয় করা ঠিক ভুল মনে করে। (20 মিনিটের জন্য উত্তর নিয়ে আসার চেষ্টা করা ব্যর্থ নয় BS
হেনেস

উত্তর:


3

আপনি এটি দিয়ে এটি করতে পারেন:
tr "~" "\n" < edi_file | tail -20 | grep ^SE

TR TR anslates নতুন লাইন সব টিলড চিহ্ন। (এগুলি একটি by n দ্বারা প্রতিনিধিত্ব করা হয়)।

এটি পূর্বে লেজকে খাওয়ানো আউটপুট, যা সর্বশেষ 20 টি রেখাকে বাদ দেয়।

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

আমি সেই বিকল্পটি বেছে নিই নি কারণ আপনার পোস্টটিতে আধুনিক লিনাক্সের পরিবর্তে জেনেরিক ইউনিক্স ট্যাগ করা হয়েছে GNU সরঞ্জাম এবং GNU নির্দিষ্ট এক্সটেনশন

অবশেষে grepএসই সমেত তাদের চূড়ান্ত লাইনগুলি ফিল্টার করে এবং ক্যারেট ( ^) নিশ্চিত করে যে এটি কোনও লাইনের শুরুতে রয়েছে। ( দুটি লাইন দেখানোর জন্য oo foooo SE foobarquz ~ SE wewanthisisartartly ~ boobar like এর মতো জিনিসগুলি প্রতিরোধ করা )।


4

আমি যখন দেখতে পাচ্ছি যে আসল ফাইলটি পরিবর্তন করতে চাইছে না, আপনি পাইপ দিয়ে অনুবাদটি করতে পারেন। এইভাবে, আপনি ডেটাটি সংশোধন করছেন না, তবে আপনি এখনও ~অবশেষে-লাইনে রূপান্তরিত করার সুবিধাটি (ইউনিক্স ইউটিলিটি পদগুলিতে) পান ।

এই কৌতুক করতে হবে:

cat ding | tr "~" "\n" | tail -3

এটি মহাবিশ্বের সবচেয়ে দক্ষ জিনিস নয়, তবে 120 এমবি ফাইলের মধ্যে এটি চালানো কোনও বড় বিষয় হওয়া উচিত নয়।

নোট দুটি সেটের উদ্ধৃতিগুলি alচ্ছিক নয় - উভয়ই ~এবং \nশেল দ্বারা ব্যাখ্যা করা হবে যদি আপনি উদ্ধৃতিগুলি ফেলে দেন।


3
tr "~" "\n" < edi_file | tail -20 | grep ^SE? ( catইনপুট পুনঃনির্দেশিত করা যেতে পারে তখন ব্যবহার করার দরকার নেই SE এসই দিয়ে শুরু হওয়া ক্ষেত্রগুলি দেখানোর জন্য
গ্রেপ

@ হেনেস: এটি একটি সহজ উত্তর, আপনি এটি যুক্ত করতে পারেন এবং আমি এটি গ্রহণ করব। আমি যেটি ব্যবহার করে শেষ করেছি তা হ'ল ট্র "" "" \ n "<এডি_ফাইল | লেজ -৩ | হেড-এন 1 তবে এটি কেবল কারণ আমি জানি যে এসই সর্বদা সর্বশেষ 3 য় থেকে শেষ বিভাগে
নোহ

সম্পন্ন. আপনার নির্দিষ্ট ডেটা ফর্ম্যাট জানার সাহায্য করে। আমি নীচের পোস্টে এবং কেন আমি এটি ব্যবহার করেছি তার জন্য আরও কিছু ব্যাখ্যা যুক্ত করেছি।
হেনেস

2

এটি trপ্রথমে বড় ফাইলগুলিতে অকার্যকর হবে , কারণ আপনি আসলে শেষ থেকে ডেটা চান, এবং trএমন ডেটা প্রক্রিয়া করবেন যা বাতিল করা হবে।

tacবিপরীতে ফাইলটি পড়তে ব্যবহার করুন , তারপরে ২০ টি প্রথম লাইন নিন (বিপরীতটির, সুতরাং প্রকৃতপক্ষে শেষটি), আসল ক্রমটি পেতে এখনই বিপরীত করুন grep:

tac -s~ edi_file | head -n 20 | tac | grep ^SE

মনে রাখবেন আপনি seek()পাইপ করতে পারবেন না !


1
আপনি ~ অক্ষরগুলি উদ্ধৃত করতে চাইবেন - শেলের উপর নির্ভর করে একাকী something কোনও কিছুতে প্রসারিত হতে পারে।
মাইকেল কোহনে

@ মিশেলকোহনে: হ্যাঁ তবে মনে হয় এটি tacনিজেই নিউলাইনগুলিতে রূপান্তরিত হবে, তাই এটির trপ্রয়োজন হবে না
জানুস ট্রয়লসন

@ আইস্যাংকোক: আপনি সম্ভবত এই পয়েন্টটি মিস করতে পারেন যে ফাইলটিতে কেবলমাত্র 1 লাইন রয়েছে।
নোয়া

@ নোয়া: এজন্য আমি -sপতাকাটি ব্যবহার করিtac
জানুস ট্রয়লসেন

@ ইয়াশকোক: আমি সোলারিস প্রশ্নটি ট্যাগ করি নি কারণ আমার মনে হয় না যে এটি গুরুত্বপূর্ণ হবে। তবে এটি প্রদর্শিত হয় যে স্যাকের সোলারিসের অধীনে ট্যাক সমর্থিত নয়। আমি আপনার জবাবটি উচ্চারণ করেছিলাম কারণ আমি নতুন কিছু শিখেছি এবং দেখে মনে হচ্ছে এটি অন্যান্য * এনএক্স সিস্টেমে কাজ করেছে
নোহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.