2016-03-23 12 views
2

Bu bir çok kez sorulmuştur, ancak bir nedenden dolayı çözümüm çalışmıyor. İki .txt dosyaları:Ayrı .txt dosyalarındaki sütunların karşılaştırılması

file1.txt

I 27804 C A 0.987700768 1024 0.518987342 
I 27810 T C 0.99418488 1054 0.518987342 
I 27816 G A 0.994650485 1085 0.518987342 
I 27822 T C 0.998170732 1097 0.518987342 
I 27825 C T 0.998170732 1101 0.518987342 

file2.txt

I 27804 . C A 1115.77 
I 27810 . T C 1141.77 
I 27816 . G A 1141.77 
I 27822 . T C 1141.77 
I 27823 . C A 1141.77 
I 27825 . C T 1141.77 

file2.txt sütunların çok sayıda (netlik için gösterilmemiştir) içermektedir.

File2.txt dosyasında karşılık gelen satırları tanımlamak için File1.txt dosyasına $ 1, $ 2, $ 3 ve $ 4 kullanmak ve sonra da File2.txt satırını tam olarak yazdırmak istiyorum.

İstenilen çıkış olacaktır: Bu girdiyle

I 27804 . C A 1115.77 
I 27810 . T C 1141.77 
I 27816 . G A 1141.77 
I 27822 . T C 1141.77 
I 27825 . C T 1141.77 

atlanan:

I 27823 . C A 1141.77 

o file1.txt mevcut olmadığından.

awk 'NR==FNR{a[$1,$2,$3,$4]=$0;next}{if(b=a[$1,$2,$4,$5]){print b}}' file1.txt file2.txt 

Ama bu file1.txt hatları dönmek için sadece görünür - ancak sadece file1.txt bütününü yeniden yayınladı:

Sadece kullanarak denedim. Neyi yanlış yaptım?

+1

'b = [...]' atama bir olduğunu. Ve eğer 'file1.txt' satırına ihtiyacınız yoksa, ilk etapta 'a' içinde saklamanız gerekmez. –

cevap

1

Bu çalışır:

awk 'NR==FNR{a[$1$2$3$4];next}{b=$1$2$4$5;if(b in a){print}}' file1.txt file2.txt