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


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.