Saya punya suka file1:
0 AFFX-SNP-000541 NA
0 AFFX-SNP-002255 NA
1 rs12103 0.6401
1 rs12103_1247494 0.696
1 rs12142199 0.7672
Dan file2:
0 AFFX-SNP-000541 1
0 AFFX-SNP-002255 1
1 rs12103 0.5596
1 rs12103_1247494 0.5581
1 rs12142199 0.4931
Dan ingin file3 sedemikian rupa sehingga:
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
Yang berarti menempatkan kolom ke-4 dari file2 ke file1 dengan nama kolom ke-2.
text-processing
awk
join
bioinformatics
Dadong Zhang
sumber
sumber
Jawaban:
Ini harus dilakukan:
Penting : ini mengasumsikan file Anda diurutkan (seperti dalam contoh Anda) sesuai dengan nama SNP. Jika tidak, urutkan terlebih dahulu:
Keluaran:
Penjelasan (dari
info join
):Jadi, perintah di atas menggabungkan file-file di bidang kedua dan mencetak bidang 1, 2 dan 3 dari file satu, diikuti oleh bidang ke-3 dari file2.
sumber
Anda bisa menggunakan
awk
:keluaran:
Penjelasan:
Walk through
file2
(NR==FNR
hanya berlaku untuk argumen file pertama). Kirimkan kolom 3 di hash-array menggunakan kolom 2 sebagai kunci:h[$2] = $3
. Kemudian berjalan melaluifile1
dan output ketiga kolom$1,$2,$3
, menambahkan kolom tersimpan yang sesuai dari hash-arrayh[$2]
.sumber
h[$2] = $3
adalah tugas hash. Ini menyimpan$3
sebagai nilai dan$2
sebagai kunci. Contoh:h["name"] = "Dadong"
. Sekarang,print h["name"]
keluaranDadong
. Itu tidak apa yang Anda inginkan, itu cocok persis kolom kedua dari kedua file.Jika Anda tidak memerlukan pemesanan apa pun, daripada solusi sederhana
Ini mengandaikan bahwa semua baris memiliki tiga entri, dan kolom 1 dan 2 dari kedua file adalah sama (seperti pada contoh data Anda)
sumber
paste
paste
bisakah Anda mencari cara untuk menjawab ini dengan coreutils?