मेल खाने वाले कॉलम के साथ दो फाइलें शामिल करें


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

File1.txt में दो कॉलम हैं और File2.txt में चार कॉलम हैं। मैं उन दोनों फाइलों में शामिल होना चाहता हूं जिनमें यूनिक आईडी है (सरणी [1] दोनों फाइलों (file1.txt & file2.txt) में मेल खाना चाहिए और ouput को केवल मिलान आईडी (आउटपुट देखें। देखें)।

मैंने कोशिश की है 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

ps। क्या ouput स्तंभ आदेश मायने रखता है?

यदि हाँ का उपयोग करें:

$ 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?
माइकल Mrozek

ऐसा इसलिए है क्योंकि sortशीर्ष लेख स्ट्रिंग अंत में है। दरअसल यह गंदा उपाय है। और सामान्य स्थिति में हेडर आउटपुट के बीच में जा सकता है। हालाँकि यह यहाँ काम करता है।
भीड़

11

उपयोग करने का एक तरीका 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.