GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kartesisches Produkt zweier Dateien (als Sätze von Zeilen) in GNU/Linux

Es wird kein Komma zum Trennen verwendet, sondern nur join :

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

Der mechanische Weg, dies in der Shell zu tun, ohne Perl oder Python zu verwenden, ist:

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

Die join Der Befehl kann manchmal für diese Operationen verwendet werden - mir ist jedoch nicht klar, dass er als degenerierter Fall ein kartesisches Produkt ausführen kann.

Ein Schritt nach oben von der Doppelschleife wäre:

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

Hier ist das Shell-Skript dafür

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

Obwohl das ziemlich langsam sein wird. Ich kann mir keine vorkompilierte Logik vorstellen, um dies zu erreichen. Der nächste Schritt für die Geschwindigkeit wäre, das Obige in awk/perl zu machen.

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

Hmm, wie wäre es mit dieser hackigen Lösung, um vorkompilierte Logik zu verwenden?

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

Linux
  1. So verbinden Sie zwei Textdateien unter Linux

  2. Zwei Dateien in zwei Spalten drucken?

  3. Zwei Spalten verschiedener Dateien vergleichen und bei Übereinstimmung drucken?

  4. Linux – Wie lösche ich Dateien, die zwischen zwei Mal erstellt wurden?

  5. Gemeinsame Linien zwischen zwei Dateien?

So vergleichen Sie zwei Dateien im Linux-Terminal

So synchronisieren Sie Dateien automatisch zwischen zwei Linux-Servern

Verwenden des Diff-Befehls zum Vergleichen zweier Dateien im Linux-Terminal

Vergleichen Sie zwei Dateien unter Linux – Verwenden Sie diff, vimdiff und colordiff

Vergleichen von zwei Dateien im Linux-Terminal

Unterschied in Leerzeichen zwischen zwei Dateien unter Linux