একই পাঠ্য ফাইলের মধ্যে বিভিন্ন লাইনে উপস্থিত একাধিক বিট তথ্য কীভাবে নিষ্কাশন করা যায়


8

আমি একই পাঠ্য ফাইলের মধ্যে বিভিন্ন লাইনে ঘটে যাওয়া সিকোয়েন্স আইডি এবং ক্লাস্টার নম্বরটি বের করার চেষ্টা করছি।

ইনপুটটি দেখে মনে হচ্ছে

>Cluster 72
0   319aa, >O311_01007... *
>Cluster 73
0   318aa, >1494_00753... *
1   318aa, >1621_00002... at 99.69%
2   318aa, >1622_00575... at 99.37%
3   318aa, >1633_00422... at 99.37%
4   318aa, >O136_00307... at 99.69%
>Cluster 74
0   318aa, >O139_01028... *
1   318aa, >O142_00961... at 99.69%
>Cluster 75
0   318aa, >O300_00856... *

পছন্দসই আউটপুট হ'ল একটি কলামের সিকোয়েন্স আইডি এবং দ্বিতীয়টিতে সংশ্লিষ্ট ক্লাস্টার নম্বর।

>O311_01007  72
>1494_00753  73
>1621_00002  73
>1622_00575  73
>1633_00422  73
>O136_00307  73
>O139_01028  74
>O142_00961  74
>O300_00856  75

যে কেউ এই ব্যাপারে সাহায্য করতে পারেন?


সিকোয়েন্স আইডিটি সর্বদা শুরু হয় না এমন লাইনে 3 ডি স্পেস-বিভাজিত ক্ষেত্র হতে চলেছে >? এছাড়াও, আপনি আমাদের বোন সাইট বায়োইনফরমেটিক্সে আগ্রহী হতে পারেন ।
টেরডন

উত্তর:


13

জোর দিয়ে:

awk -F '[. ]*' 'NF == 2 {id = $2; next} {print $3, id}' input-file
  • আমরা ক্ষেত্রগুলি বা পিরিয়ডের সাথে ক্ষেত্রগুলি বিভক্ত করি -F '[. ]*'
  • দুটি ক্ষেত্রের >Clusterরেখা ( রেখাগুলি) সহ দ্বিতীয় ক্ষেত্রটি আইডি হিসাবে সংরক্ষণ করুন এবং পরবর্তী লাইনে যান
  • অন্যান্য লাইনের সাহায্যে তৃতীয় ক্ষেত্র এবং সংরক্ষণ করা আইডি মুদ্রণ করুন

ক্ষেত্রের সংখ্যা বন্ধ করে রাখার $1 == ">Cluster"পরিবর্তে NF == 2, ফাইলের মধ্যে কী থাকতে পারে তার উপর নির্ভর করে স্পষ্টতই তার পরিবর্তে সন্ধান করা ভাল be
মন্টি হার্ডার

5

আপনি এটির awkজন্য ব্যবহার করতে পারেন :

awk '/>Cluster/{
      c=$2;
      next
    }{
      print substr($3,2,length($3)-4), c
    }' file

প্রথম ব্লক স্টেটমেন্টটি ক্লাস্টার আইডি ক্যাপচার করছে। দ্বিতীয় ব্লক স্টেটমেন্টটি (ডিফল্ট একটি) পছন্দসই ডেটা বের করছে এবং এটি মুদ্রণ করছে।


আপনার পক্ষে " "যুক্তি হিসাবে দেওয়ার দরকার নেই print। আর্গুমেন্টগুলি আলাদা করতে কেবল একটি কমা ব্যবহার করুন এবং এটি আর্গুমেন্টগুলি পৃথক করতে OFS, ডিফল্ট স্পেস ব্যবহার করবে।
মুরু

4

ওয়ান-লাইনার হিসাবে রুবির সাথে এখানে একটি বিকল্প রয়েছে:

ruby -ne 'case $_; when /^>Cluster (\d+)/;id = $1;when /, (>\w{4}_\w{5})\.\.\./;puts "#{$1} #{id}";end' input_file

বা একাধিক লাইনে ছড়িয়ে দিন:

ruby -ne 'case $_
when /^>Cluster (\d+)/
  id = $1
when /, (>\w{4}_\w{5})\.\.\./
  puts "#{$1} #{id}"
end' input_file

আমার ধারণা, awkআপনি যদি রুবি এবং রেজেক্সেন জানেন তবে সংস্করণটির চেয়ে এটি কেবলমাত্র বেশি পঠনযোগ্য । বোনাস হিসাবে, এই কোডটি কেবল লাইনগুলি বিভক্ত করার চেয়ে কিছুটা বেশি শক্তিশালী হতে পারে, কারণ এটি আশেপাশের পাঠ্যের সন্ধান করে।


1

পার্ল:

$ perl -ne 'if(/^>.*?(\d+)/){$n=$1;}else{ s/.*(>[^.]+).*/$1 $n/; print}' file 
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75

ব্যাখ্যা

  • perl -ne: লাইন দ্বারা ইনপুট ফাইল লাইন পড়ুন ( -n) এবং -eপ্রতিটি লাইনের দ্বারা প্রদত্ত স্ক্রিপ্ট প্রয়োগ করুন ।
  • if(/^>.*?(\d+)/){$n=$1;}: যদি এই লাইনটি একটি দিয়ে শুরু হয় >তবে লাইনের শেষে দীর্ঘতম সংখ্যার সন্ধান করুন এবং এটি সংরক্ষণ করুন $n
  • else{ s/.*(>[^.]+).*/$1 $n/; print: যদি লাইনটি শুরু না >হয় তবে অ ( .অক্ষর ) অনুসরণ করে অক্ষরের দীর্ঘতম প্রসারকে সবকিছু >( >[^.]+) হিসাবে সিকোয়েন্স নামটি ( $1কারণ আমরা রেজেক্স ম্যাচটি ক্যাপচার করেছি ) এবং বর্তমান মানটি দিয়ে প্রতিস্থাপন করুন $n

বা, আরও বিশ্রী মত পদ্ধতির জন্য:

$ perl -lane 'if($#F==1){$n=$F[1]}else{$F[2]=~s/\.+$//; print "$F[2] $n"}' file 
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75

এটি বিভিন্ন awkপদ্ধতির মত একই প্রাথমিক ধারণাটি করার আরও কিছুটা জটিল কাজ । আমি এটি সমাপ্তির স্বার্থে এবং পার্ল ভক্তদের জন্য অন্তর্ভুক্ত করছি। আপনার যদি কোনও ব্যাখ্যা প্রয়োজন হয়, কেবলমাত্র awk সমাধানগুলি ব্যবহার করুন :)।

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