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


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.