Menggabungkan dua file, satu kolom sekaligus

12

Saya memiliki 2 file besar (3000 kolom, 15000 baris) dengan format berikut

file1 (dipisahkan tab):

1/0 0/0 0/0
0/0 1/1 0/0
1/1 0/1 0/0

file2 (dipisahkan tab):

3 5 2
1 7 10
3 4 3

Saya ingin menggabungkan nilai dari kolom pertama setiap file dengan pemisah ":", lalu beralih ke kolom kedua, ketiga, dll. Output yang diinginkan (dipisahkan tab):

1/0:3 0/0:5 0/0:2
0/0:1 1/1:7 0/0:10
1/1:3 0/1:4 0/0:3

Efisiensi tidak kritis, jadi bahasa apa pun baik-baik saja. Saya minta maaf jika ini sudah ditanyakan sebelumnya.

Jon Degner
sumber

Jawaban:

14

Sesuatu seperti ini? Bekerja dengan data sampel Anda:

paste  file{1,2} | awk '{for (i=1;i<=NF/2; i++){printf "%s:%s\t",$i,$(NF/2+i)};printf "\n"}'
1/0:3   0/0:5   0/0:2
0/0:1   1/1:7   0/0:10
1/1:3   0/1:4   0/0:3
Tink
sumber
2
Saya suka tempel. +1
glenn jackman
Cukup adil @ glennjackman; Saya akan mengubah jawaban saya.
tink
Iya! Bekerja dengan sempurna! Terima kasih atas tanggapan cepatnya.
Jon Degner
9
awk '{
    getline f2 < "file2"
    split(f2, a)
    for (i=1; i<=NF; i++) 
        printf "%s:%s\t", $i, a[i]
    print ""
}' file1
glenn jackman
sumber
Bekerja dengan sempurna, meskipun saya lebih suka kesederhanaan dari tanggapan tink.
Jon Degner
1
@JonDegner lalu jika jawaban itu (atau yang ini) menyelesaikan masalah Anda, silakan luangkan waktu dan terima dengan mengklik tanda centang di sebelah kiri. Itu akan menandai pertanyaan sebagai dijawab dan cara terima kasih diungkapkan di situs Stack Exchange.
terdon
6

Pendekatan yang sedikit berbeda:

paste -d: <(xargs -n1 <file1) <(xargs -n1 <file2) | xargs -n 3
Michael Vehrs
sumber
Saya membenarkan ini, tetapi baru menyadari bahwa bagian -n 3 hanya bekerja pada sampel yang disediakan. Jumlah kolom perlu dimodifikasi untuk mengakomodasi data aktual.
tink
@tink Jelas, ya. Namun, Anda dapat menghitung jumlah kolom dengan sesuatu seperti head -n1 | wc -w.
Michael Vehrs
Heh. Itu tidak dimaksudkan untuk Anda tanggapi, saya sangat sadar bagaimana cara mengatasinya ... hanya sebuah penjelasan bahwa jawaban Anda seharusnya memiliki satu kurang upvote:}
tink