GNU/Linux >> Linux Esercitazione >  >> Linux

Prodotto cartesiano di due file (come insiemi di righe) in GNU/Linux

Non ci sarà una virgola per separare ma solo join :

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

Il modo meccanico per farlo in shell, senza usare Perl o Python, è:

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

L'join Il comando a volte può essere utilizzato per queste operazioni, tuttavia non mi è chiaro se possa eseguire il prodotto cartesiano come caso degenere.

Un passo avanti rispetto al doppio giro sarebbe:

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

Ecco lo script della shell per farlo

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

Anche se sarà piuttosto lento. Non riesco a pensare a nessuna logica precompilata per ottenere questo risultato. Il prossimo passo per la velocità sarebbe fare quanto sopra in awk/perl.

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

Hmm, che ne dici di questa soluzione hack per utilizzare la logica precompilata?

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

Linux
  1. Come visualizzare i file di configurazione senza commenti in Linux

  2. Stampa due file in due colonne?

  3. Confronta due colonne di file diversi e stampa se corrisponde?

  4. Linux:come eliminare i file creati tra due volte?

  5. Linee comuni tra due file?

Come confrontare due file nel terminale Linux

Come sincronizzare automaticamente i file tra due server Linux

Utilizzo del comando Diff per confrontare due file nel terminale Linux

Confronta due file in Linux – Usando diff, vimdiff e colordiff

Confronto di due file nel terminale Linux

Differenza negli spazi bianchi tra due file su Linux