2011-02-11 28 views
5

İki dosyayı, onların ikinci sütunlarının içeriğine göre birleştirmek istiyorum.unix: 2. sütunları kullanarak 2 dosya birleştirme

Dosya 1:

"4742" "209220_at"  2.60700394801826 
"104" "209396_s_at" 2.60651442103297 
"749" "202409_at"  2.59424724783704 
"4168" "209875_s_at" 2.58773204877464 
"3973" "1431_at"  2.52832098784342 
"1826" "207201_s_at" 2.41685345240968 

File2: olmadan, ben commdiff denedi

"3973" "1431_at"  2.52832098784342 "653" "1431_at"  2.14595534191867 
"1826" "207201_s_at" 2.41685345240968 "1109" "207201_s_at" 2.13777517447307 

bazı karanlık awk tek astar:

"653" "1431_at"  2.14595534191867 
"1109" "207201_s_at" 2.13777517447307 
"353" "212531_at"  2.12706340284672 
"381" "206535_at"  2.11456707231618 
"1846" "204534_at"  2.10919474441178 

sonunda sahip olmak herhangi bir başarı. Herhangi bir yardım çok takdir. Ben

cevap

2
awk ' 
    # store the first file, indexed by col2 
    NR==FNR {f1[$2] = $0; next} 
    # output only if file1 contains file2's col2 
    ($2 in f1) {print f1[$2], $0} 
' file1 file2 
+2

, tüm dosyanın1 belleğe kaydedileceğini unutmayın, böylece daha küçük dosyayı 'file1 'olarak atayabilirsiniz. –

0

Dosya kükse, bir programda bir kod yazma diline (Perl, Python ve Ruby hepsi iyi seçimler) yazın, bu anahtarlar ikinci sütun olan bir hashı ilk olarak okur, sonra ikinci dosyadan okunur. ve (eğer herhangi bir şey varsa) neyin birleştirilebileceğini belirlemek için karma aramalar kullanın.

Dosyalar büyükse, her dosya için, birinci ve ikinci sütunları değiştirin, bunları unix sort yardımcı programından geçirin ve sonra bir betik dili dilinde birleştirme (artı sütun yeniden sırala) iki sıralı dosyaları.

5

Bunu, sort ve join komutlarının bir kombinasyonu ile yapabilirsiniz. Basit bir yaklaşım,

ancak bu, aradığınızdan biraz farklı görüntüler. Bu sadece ortak sen gösterdi tam olarak biçimi gerekiyorsa

"1431_at" "3973" 2.52832098784342 "653" 2.14595534191867 
"207201_s_at" "1826" 2.41685345240968 "1109" 2.13777517447307 

, o zaman bu şekilde çıkışa join anlatmak gerekir her dosyadan alan ve daha sonra kalan alanları katılmak gösterir

join -o 1.1,1.2,1.3,2.1,2.2,2.3 -j2 <(sort -k2 file1) <(sort -k2 file2) 
-o

, FILENUM.FIELDNUM belirticilerin listesini kabul eder. Kullanıyorum <() sözdizimi POSIX sh değil, bu yüzden POSIX sh sözdizimi gerekiyorsa, geçici bir dosyaya sıralamalısınız. Not Eğer bash belirli sürümlerini kullanıyorsanız

+0

, ayrıca yazabilirsiniz: '-j2 katılmak <(bir çeşit -k2 dosya {1,2})' Bunun dışında –

+0

ikisi ile katılmak sağlamaz farklı girişler. – jamessan

0
awk 'FNR==NR{a[$2]=$0} NR>FNR && ($2 in a){ print $0,a[$2] } ' file2 file1