একটি ব্যাশ কমান্ডের একটি ডিরেক্টরির মধ্যে ফাইলের একটি তালিকা মাধ্যমে যেতে, খুঁজে পেতে সংখ্যা 1-9 replicates, এবং একটি নতুন ফাইল মধ্যে তাদের সংযোজন করা হয়


0

আমি একটি গুচ্ছ ফাইল সঙ্গে একটি ডিরেক্টরি আছে উদা:

ExperimentA_Rep1.bed
ExperimentA_Rep2.bed
ExperimentA_Rep3.bed
ExperimentB_Rep1.bed
ExperimentD_Rep1.bed
ExperimentC_Rep1.bed
ExperimentC_Rep2.bed
.
.
.
ExperimentZ_Rep5.bed

আমাকে একটি ডিরেক্টরীতে ফাইলের নামের মাধ্যমে স্ক্যান করতে হবে এবং একই পরীক্ষা থেকে ফাইলগুলিকে সংযোজিত করতে হবে, তবে নতুন ফাইলটিতে ভিন্ন প্রতিলিপি করা হবে।

I.e

cat ExperimentA_Rep1.bed ExperimentA_Rep2.bed > ExperimentA_merged.bed

পরীক্ষার শুধুমাত্র 1 প্রতিলিপি আছে, এটা কিছু করতে হবে না। কিন্তু আমি এটি হার্ডকোড করতে পারছি না, এটি পরীক্ষার কোনও ডেটাসেটের জন্য প্রযোজ্য হতে হবে।

আমি একটি পাইথন স্ক্রিপ্ট দৌড়ে যে ঠিক আছে।

উত্তর:


0

এই শেল স্ক্রিপ্টটি চেষ্টা করুন:

for f in *Rep1.bed
do
    cat "${f%Rep1.bed}"*.bed >"$f.merged"
done

কিভাবে এটা কাজ করে

আপনার উদাহরণে প্রতিটি পরীক্ষার একটি ফাইল যার নাম শেষ হয়েছে Rep1.bed। যে পরীক্ষা সব ফাইল খুঁজে পেতে, আমরা glob ব্যবহার করতে পারেন ${f%Rep1.bed}"*.bed। তারপর যারা ফাইল একটি একক ফাইল সংকলিত করা হয়। এই প্রতিটি পরীক্ষা জন্য পুনরাবৃত্তি করা হয়।

ফর্ম ${f%Rep1.bed} প্রত্যয় অপসারণের একটি উদাহরণ। এটা পরিবর্তনশীল লাগে f এবং অনুসরণ করে যে প্যাটার্ন যে কোন ঘটনার শেষ থেকে মুছে ফেলা হয় % চিহ্ন. উদাহরণস্বরূপ, একটি শেল ভেরিয়েবল তৈরি করা যাক:

$ f=ExperimentC_Rep2.bed
$ echo "${f}"
ExperimentC_Rep2.bed

এখন, এর অপসারণ করা যাক .bed শেষ থেকে

$ echo "${f%.bed}"
ExperimentC_Rep2

অথবা, আমরা এখানে প্রয়োজন হিসাবে, আমরা একটি দীর্ঘ স্ট্রিং মুছে ফেলতে পারেন Rep2.bed:

$ echo "${f%Rep2.bed}"
ExperimentC_

উপরে উল্লিখিত কি প্রতিলিপি নম্বর মুছে ফেলা সঙ্গে পরীক্ষা নাম। আমরা গ্লোবাল ব্যবহার করে এই পরীক্ষামূলক নামের সাথে যুক্ত সমস্ত প্রতিলিপি ফাইল নির্বাচন করতে ব্যবহার করতে পারি "${f%Rep1.bed}"*.bed

একটি লাইন হিসাবে

যখন কোডটি ইন্টারেক্টিভ চালানো হয়, এটি একটি একক লাইন হিসাবে এটি চালানো কখনও কখনও সহজ হয়। উপরের কোডটি, একটি লাইন হিসাবে, হল:

for f in *Rep1.bed; do cat "${f%Rep1.bed}"*.bed >"$f.merged"; done

2 অথবা আরও প্রতিলিপি সঙ্গে পরীক্ষা জন্য শুধুমাত্র একটি মার্জ ফাইল তৈরি করা

কিছু পরীক্ষার মাত্র একটি প্রতিরূপ আছে ( *_Rep1.bed )। অন্য অনেক আছে: _Rep1.bed, _Rep2.bed, .... যদি আমরা কেবল দুটি বা তার বেশি ফাইল নির্বাচন করতে চাই, তবে আমরা কেবলমাত্র সেই ফাইলগুলি নির্বাচন করতে পারি Rep2 বিদ্যমান:

for f in *Rep2.bed; do cat "${f%Rep2.bed}"*.bed >"$f.merged"; done

আপনি ব্যাখ্যা করবেন না কেন আপনি ব্যবহার করেন নি >> চূড়ান্ত ফাইল বা ব্যবহার যোগ করুন > পরে done? আমি এটা নিজে চালাইনি, কিন্তু আপনি এই দৃষ্টিভঙ্গির বিষয়ে আরও ব্যাখ্যা দিতে পারেন? আপনার উদাহরণটি প্রতিটি সময়ে একবার প্রতিটি ফাইলের মাধ্যমে যেতে পারে না যাতে "$ f.merged" প্রতিটি পাসে ওভাররাইট হয়ে যায়?
rubynorails

এটি স্পষ্টভাবে কাজ করে, যদিও এটি সমস্ত পরীক্ষার জন্য একটি একত্রিত ফাইল তৈরি করে, এমনকি এমনও রয়েছে যা শুধুমাত্র 1 টি প্রতিলিপি তৈরি করে। এছাড়াও কোঁকড়া বন্ধনী মধ্যে "Rep1.bed" শব্দটি কেন। বনাম
Anonymous

1
@ রুবিনোরেলস আমরা যদি সব পরীক্ষার জন্য একটি ফাইল তৈরি করতে চাইতাম তাহলে তা করব। কিন্তু, ওপি চেয়েছিলেন "একই পরীক্ষা থেকে আসা ফাইলগুলিকে একত্রিত করুন, তবে নতুন ফাইলের মধ্যে ভিন্ন প্রতিলিপি করা হয়।" সুতরাং, প্রতিটি পৃথক পরীক্ষা এটি নিজস্ব ফাইল পায়। যে কেন > পরে না done বিবৃতি।
John1024

@ অজ্ঞাত (1) আমি শুধুমাত্র সেই পরীক্ষাগুলি নির্বাচন করতে কোড যোগ করেছি Rep2 বিদ্যমান, যে ভাবে, আপনি শুধুমাত্র দুটি বা আরো প্রতিলিপি সঙ্গে পরীক্ষা জন্য একত্রিত ফাইল পেতে হবে। (2) আমি উত্তর একটি ব্যাখ্যা জন্য যোগ করা প্রত্যয় অপসারণ কারন "Rep1.bed" শব্দটি কোঁকড়া বন্ধনীগুলিতে ছিল।
John1024
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.