মেলানো কলামগুলির সাথে দুটি ফাইল যোগ দিন


11

File1.txt

    id                            No
    gi|371443199|gb|JH556661.1| 7907290
    gi|371443198|gb|JH556662.1| 7573913
    gi|371443197|gb|JH556663.1| 7384412
    gi|371440577|gb|JH559283.1| 6931777

File2.txt

 id                              P       R       S
 gi|367088741|gb|AGAJ01056324.1| 5       5       0
 gi|371443198|gb|JH556662.1|     2       2       0
 gi|367090281|gb|AGAJ01054784.1| 4       4       0
 gi|371440577|gb|JH559283.1|     21      19      2

output.txt

 id                              P       R       S  NO
 gi|371443198|gb|JH556662.1|     2       2       0  7573913
 gi|371440577|gb|JH559283.1|     21      19      2  6931777

ফাইল 1.txt এর দুটি কলাম এবং ফাইল 2.txt এর চারটি কলাম রয়েছে। আমি উভয় ফাইলের সাথে যুক্ত হতে চাই যার অনন্য আইডি রয়েছে (অ্যারে [1] উভয় ফাইলের সাথে মিলিত হওয়া উচিত (file1.txt & file2.txt) এবং কেবল আউটপুট ম্যাচ করা আইডি দিতে হবে (আউটপুট.টেক্সট দেখুন)।

চেষ্টা করেছি join -v <(sort file1.txt) <(sort file2.txt)। Awk বা যোগদানের আদেশগুলির সাথে কোনও সহায়তা অনুরোধ করা হয়েছে।

উত্তর:


18

join দুর্দান্ত কাজ করে:

$ join <(sort File1.txt) <(sort File2.txt) | column -t | tac
 id                           No       P   R   S
 gi|371443198|gb|JH556662.1|  7573913  2   2   0
 gi|371440577|gb|JH559283.1|  6931777  21  19  2

পুনশ্চ. আউটপুট কলাম অর্ডার ব্যাপার?

যদি হ্যাঁ ব্যবহার করুন:

$ join <(sort 1) <(sort 2) | tac | awk '{print $1,$3,$4,$5,$2}' | column -t
 id                           P   R   S  No
 gi|371443198|gb|JH556662.1|  2   2   0  7573913
 gi|371440577|gb|JH559283.1|  21  19  2  6931777

দুর্দান্ত কাজ করে কলামের অর্ডার কোনও বিষয় নয়
— জ্যাক

অন্তর্ভুক্ত করার কারণ কী tac?
— মাইকেল মরোজেক

এটি কারণ sortশিরোনাম স্ট্রিং শেষে। আসলে এটি নোংরা সমাধান। এবং সাধারণ ক্ষেত্রে শিরোনাম আউটপুট মাঝখানে যেতে পারে। তবে এটি এখানে কাজ করে।
— নলখাগড়া

10

একটি উপায় ব্যবহার awk:

এর বিষয়বস্তু script.awk:

## Process first file of arguments. Save 'id' as key and 'No' as value
## of a hash.
FNR == NR {
    if ( FNR == 1 ) { 
        header = $2
        next
    }   
    hash[ $1 ] = $2
    next
}

## Process second file of arguments. Print header in first line and for
## the rest check if first field is found in the hash.
FNR < NR {
    if ( $1 in hash || FNR == 1 ) { 
        printf "%s %s\n", $0, ( FNR == 1 ? header : hash[ $1 ] ) 
    }   
}

এটি চালান:

awk -f script.awk File1.txt File2.txt | column -t

নিম্নলিখিত ফলাফল সহ:

id                           P   R   S  NO
gi|371443198|gb|JH556662.1|  2   2   0  7573913
gi|371440577|gb|JH559283.1|  21  19  2  6931777

মূল লাইন ক্রম রাখার জন্য +65535। :-)
— zeekvfu

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