GNU/Linux >> Belajar Linux >  >> Linux

Produk Cartesian dari dua file (sebagai kumpulan baris) di GNU/Linux

Tidak akan ada koma untuk dipisahkan tetapi hanya menggunakan join :

$ join -j 2 file1 file2
 a c
 a d
 a e
 b c
 b d
 b e

Cara mekanis untuk melakukannya di shell, bukan menggunakan Perl atau Python, adalah:

while read line1
do
    while read line2
    do echo "$line1, $line2"
    done < file2
done < file1

join perintah kadang-kadang dapat digunakan untuk operasi ini - namun, saya tidak jelas apakah itu dapat melakukan produk cartesian sebagai kasus yang merosot.

Satu langkah maju dari putaran ganda adalah:

while read line1
do
    sed "s/^/$line1, /" file2
done < file1

Inilah skrip shell untuk melakukannya

while read a; do while read b; do echo "$a, $b"; done < file2; done < file1

Meskipun itu akan sangat lambat. Saya tidak dapat memikirkan logika yang telah dikompilasi sebelumnya untuk melakukannya. Langkah selanjutnya untuk kecepatan adalah melakukan hal di atas dalam awk/perl.

awk 'NR==FNR { a[$0]; next } { for (i in a) print i",", $0 }' file1 file2

Hmm, bagaimana dengan solusi peretasan ini untuk menggunakan logika yang telah dikompilasi sebelumnya?

paste -d, <(sed -n "$(yes 'p;' | head -n $(wc -l < file2))" file1) \
          <(cat $(yes 'file2' | head -n $(wc -l < file1)))

Linux
  1. Cetak Dua File Dalam Dua Kolom?

  2. Bandingkan Dua Kolom File Yang Berbeda Dan Cetak Jika Cocok?

  3. Linux – Bagaimana Cara Menghapus File yang Dibuat Antara Dua Kali?

  1. mengekstraksi nilai unik antara 2 set/file

  2. Bagaimana cara melakukan perbedaan biner pada dua file berukuran identik di Linux?

  3. Bagaimana menemukan file yang berisi dua string bersama di Linux?

  1. Cara Melihat File Konfigurasi Tanpa Komentar di Linux

  2. Cara Menggabungkan Dua File Teks di Linux

  3. Alat Linux Untuk Memperlakukan File Sebagai Set Dan Melakukan Operasi Set Pada Mereka?