GNU/Linux >> Tutoriales Linux >  >> Linux

Producto cartesiano de dos archivos (como conjuntos de líneas) en GNU/Linux

No habrá una coma para separar pero usando solo join :

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

La forma mecánica de hacerlo en shell, sin usar Perl o Python, es:

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

El join El comando a veces se puede usar para estas operaciones; sin embargo, no tengo claro que pueda hacer un producto cartesiano como un caso degenerado.

Un paso por encima del bucle doble sería:

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

Aquí hay un script de shell para hacerlo

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

Aunque eso será bastante lento. No puedo pensar en ninguna lógica precompilada para lograr esto. El próximo paso para la velocidad sería hacer lo anterior en awk/perl.

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

Hmm, ¿qué tal esta solución hacky para usar lógica precompilada?

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

Linux
  1. Cómo ver archivos de configuración sin comentarios en Linux

  2. Cómo unir dos archivos de texto en Linux

  3. ¿Herramientas de Linux para tratar archivos como conjuntos y realizar operaciones de conjuntos en ellos?

  4. ¿Líneas comunes entre dos archivos?

  5. ¿Cómo encontrar archivos que contengan dos cadenas juntas en Linux?

Cómo comparar dos archivos en la terminal de Linux

Cómo Rsync archivos entre dos servidores Linux automáticamente

Uso del comando Diff para comparar dos archivos en la terminal de Linux

Compare dos archivos en Linux:use diff, vimdiff y colordiff

Comparando dos archivos en la terminal de Linux

Diferencia en espacios en blanco entre dos archivos en Linux