দুটি কলামের মিলের ভিত্তিতে দুটি ফাইল কীভাবে মার্জ করবেন?


33

আমার কাছে ফাইল 1 টি পছন্দ রয়েছে:

0   AFFX-SNP-000541  NA
0   AFFX-SNP-002255  NA
1   rs12103          0.6401
1   rs12103_1247494  0.696
1   rs12142199       0.7672

এবং একটি ফাইল 2:

0   AFFX-SNP-000541   1
0   AFFX-SNP-002255   1
1   rs12103           0.5596
1   rs12103_1247494   0.5581
1   rs12142199        0.4931

এবং একটি ফাইল 3 চাই যে:

0   AFFX-SNP-000541     NA       1
0   AFFX-SNP-002255     NA       1
1   rs12103             0.6401   0.5596
1   rs12103_1247494     0.696    0.5581
1   rs12142199          0.7672   0.4931

যার অর্থ 2 র্থ কলামের নামে ফাইল 1 এর 4 র্থ কলামটি ফাইল 1 এ করা উচিত।


1
ফাইল 2 পেয়েছে মাত্র তিনটি কলাম?
বার্নহার্ড

উত্তর:


48

এটি করা উচিত:

join -j 2 -o 1.1,1.2,1.3,2.3 file1 file2

গুরুত্বপূর্ণ : এটি ধরে নেয় আপনার ফাইলগুলি SNP নাম অনুসারে বাছাই করা হয়েছে (যেমন আপনার উদাহরণ হিসাবে)। যদি তা না হয় তবে প্রথমে তাদের বাছাই করুন:

join -j 2 -o 1.1,1.2,1.3,2.3 <(sort -k2 file1) <(sort -k2 file2)

আউটপুট:

0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931

ব্যাখ্যা (থেকে info join):

`join 'স্ট্যান্ডার্ড আউটপুটে প্রতিটি জোড় ইনপুট লাইনের জন্য একটি লাইন লিখেছে যাতে অভিন্ন জোড় ক্ষেত্র রয়েছে।

`-1 FIELD'
     Join on field FIELD (a positive integer) of file 1.

`-2 FIELD'
     Join on field FIELD (a positive integer) of file 2.

`-j FIELD'
     Equivalent to `-1 FIELD -2 FIELD'.

`-o FIELD-LIST'

 Otherwise, construct each output line according to the format in
 FIELD-LIST.  Each element in FIELD-LIST is either the single
 character `0' or has the form M.N where the file number, M, is `1'
 or `2' and N is a positive field number.

সুতরাং, উপরের কমান্ডটি দ্বিতীয় ক্ষেত্রের ফাইলগুলিতে যোগদান করে এবং ফাইলের প্রথম, দ্বিতীয় এবং তৃতীয় ক্ষেত্রটি প্রিন্ট করে, তারপরে ফাইল 2 এর 3 য় ক্ষেত্র প্রিন্ট করে।


16

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

$ awk 'NR==FNR {h[$2] = $3; next} {print $1,$2,$3,h[$2]}' file2 file1 > file3

আউটপুট:

$ cat file3
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931

ব্যাখ্যা:

চলুন file2( NR==FNRশুধুমাত্র প্রথম ফাইলের যুক্তির জন্য এটি সত্য)। হ্যাশ-বিন্যস্ত কলাম সংরক্ষণ 3 চাবি হিসাবে কলাম 2 ব্যবহার করছে: h[$2] = $3। তারপরে হাঁটুনfile1 এবং আউটপুট তিনটি কলাম $1,$2,$3, হ্যাশ-অ্যারে থেকে সংশ্লিষ্ট সংরক্ষিত কলাম সংযোজন h[$2]


অনেক ধন্যবাদ. কেবল ভাবছি, 'এইচ [$ 2] = $ 3' এর অর্থ কী? আসলে আমার জটিল ক্ষেত্রে আমার ফাইল 1 $ 2 == ফাইল 2 $ 2 এর সাথে ঠিক মিল করতে হবে (এটি একই ক্রমে প্রয়োজনীয় নয়)।
দাদং জাং

1
h[$2] = $3হ্যাশ অ্যাসাইনমেন্ট। এটি $3মান এবং $2কী হিসাবে সংরক্ষণ করে। উদাহরণ: h["name"] = "Dadong"। এখন, print h["name"]আউটপুট Dadong। এটি আপনি যা চান তা করে, এটি উভয় ফাইলের দ্বিতীয় কলামের সাথে ঠিক মিলছে।
গ্রেবনেকে

6

আপনার যদি কোনও অর্ডারিংয়ের প্রয়োজন না হয় তবে একটি সহজ সমাধান হ'ল

paste file{1,2} | awk '{print $1,$2,$3,$6}' > file3

এটি অনুমান করে যে সমস্ত সারিটিতে তিনটি এন্ট্রি রয়েছে এবং উভয় ফাইলের কলাম 1 এবং 2 একই (আপনার উদাহরণের ডেটা হিসাবে)


1
এর দুর্দান্ত ব্যবহারের জন্য +1paste
গ্রেবনেকে

1
@grebneke এবং বের্নহার্ট, যেহেতু আপনি সমর্থকদের হবে বলে মনে হচ্ছে pasteআপনি উত্তর একটি উপায় চিন্তা করতে পারেন এই coreutils সঙ্গে?
terdon

@ ইটারডন - একটি নম্র প্রচেষ্টা: unix.stackexchange.com/a/113909/32165
গ্রেবনেকে

1
@ অ্যারডন আমি এই প্রোগ্রামটির পুনর্বিবেচনা করার পরামর্শ দিচ্ছি ***
বার্নহার্ড

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