Menggabungkan kolom dari dua file terpisah

10

Bagaimana cara membuat file baru menggabungkan kolom selektif dari dua file terpisah menggunakan awk? Tanpa mengacaukan pesanan elemen file KEDUA.

Contoh: File 3 dapat berisi kolom 1,2,3 dari File 1 dan kolom 4 dari File 2.

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5
dovah
sumber

Jawaban:

4

Coba ini:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5
cuonglm
sumber
Terima kasih! Saya juga berhasil mencoba jalan keluar ini menggunakan gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah
2
@Dovah: Anda dapat menggunakan paste file1 file2dan kemudian mencetak bidang yang dipilih di awk.
cuonglm
Ini menyimpan file2dalam memori, yang bisa menjadi penghalang jika file berukuran besar. Ada cara yang lebih sederhana untuk melakukan ini tanpa overhead memori (lihat jawaban saya).
Gilles 'SO- stop being evil'
17

Ada alat khusus untuk itu: paste. Ini menggabungkan setiap baris penuh dari file pertama dengan baris yang sesuai dari file kedua; Anda dapat menghapus kolom yang tidak diinginkan sebelum atau sesudah. Misalnya, dengan asumsi bahwa kolom Anda dibatasi-tab:

paste file1.txt file2.txt | cut -f 1,2,3,6

Berikut adalah cara untuk menyaring kedua file yang bergantung pada substitusi proses ksh / bash / zsh.

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

Awk terutama diarahkan untuk memproses satu file pada satu waktu, tetapi Anda dapat menelepon getlineuntuk membaca dari file lain secara paralel.

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

Sejauh ini saya berasumsi bahwa Anda ingin mencocokkan baris 1 dari file 1 dengan baris 1 dari file 2, baris 2 dari file 1 dengan baris 2 dari file 2, dll. Jika Anda ingin mencocokkan isi kolom, itu adalah hal yang sama sekali berbeda. joinakan melakukan pekerjaan asalkan kolom yang ingin Anda cocok diurutkan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber