GNU/Linux >> Tutoriels Linux >  >> Linux

Produit cartésien de deux fichiers (sous forme d'ensembles de lignes) sous GNU/Linux

Il n'y aura pas de virgule pour séparer mais en utilisant uniquement join :

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

La manière mécanique de le faire en shell, sans utiliser Perl ou Python, est :

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

Le join La commande peut parfois être utilisée pour ces opérations - cependant, je ne suis pas sûr qu'elle puisse faire un produit cartésien comme un cas dégénéré.

Une étape à partir de la double boucle serait :

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

Voici le script shell pour le faire

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

Bien que cela soit assez lent. Je ne vois aucune logique précompilée pour accomplir cela. La prochaine étape pour la vitesse serait de faire ce qui précède dans awk/perl.

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

Hmm, que diriez-vous de cette solution hacky pour utiliser une logique précompilée ?

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

Linux
  1. Comment afficher les fichiers de configuration sans commentaires sous Linux

  2. Imprimer deux fichiers sur deux colonnes ?

  3. Comparez deux colonnes de fichiers différents et imprimez si cela correspond ?

  4. Linux – Comment supprimer des fichiers créés entre deux fois ?

  5. Lignes communes entre deux fichiers ?

Comment comparer deux fichiers dans un terminal Linux

Comment synchroniser automatiquement des fichiers entre deux serveurs Linux

Utilisation de la commande Diff pour comparer deux fichiers dans un terminal Linux

Comparez deux fichiers sous Linux - Utilisation de diff, vimdiff et colordiff

Comparer deux fichiers dans un terminal Linux

Différence d'espace entre deux fichiers sous Linux