Eşleşen sütunlarla iki dosyaya katılın


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 dosyasının iki sütunu vardır ve File2.txt dosyasının dört sütunu vardır. Ben benzersiz bir kimliği (dizi [1] her iki dosya (dosya1.txt & dosya2.txt) ile eşleşmeli ve çıkış sadece eşleşen kimliği vermek gerekir (her iki çıkış).

Denedim join -v <(sort file1.txt) <(sort file2.txt). Awk veya join komutları ile ilgili herhangi bir yardım istendi.

Yanıtlar:


18

join harika çalışıyor:

$ 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. çıkış sütunu sırası önemlidir?

evet ise kullanın:

$ 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

harika çalışıyor. sütun sırası önemli değil
jack

Dahil etmenin nedeni nedir tac?
Michael Mrozek

Çünkü sortbaşlık dizesini sonuna yerleştirir. Aslında kirli bir çözüm. Ve genel olarak başlık, çıktının ortasına girebilir. Ancak burada çalışıyor.
rush

11

Kullanmanın tek yolu awk:

İçeriği 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 ] ) 
    }   
}

Gibi çalıştırın:

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

Aşağıdaki sonuçla:

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

Orijinal satır sırasını korumak için +65535. :-)
zeekvfu

Orijinal satır sırasını korumak için +65535. :-)
zeekvfu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.