GNU/Linux >> Znalost Linux >  >> Linux

Kartézský součin dvou souborů (jako sady řádků) v GNU/Linux

Nebude se oddělovat čárkou, ale použije se pouze join :

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

Mechanický způsob, jak to udělat v shellu, bez použití Perlu nebo Pythonu, je:

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

join pro tyto operace lze někdy použít příkaz - není mi však jasné, že může udělat kartézský součin jako degenerovaný případ.

O krok výše z dvojité smyčky by bylo:

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

Zde je skript shellu, jak to udělat

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

I když to bude docela pomalé. Nenapadá mě žádná předkompilovaná logika, jak toho dosáhnout. Dalším krokem pro rychlost by bylo provést výše uvedené v awk/perl.

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

Hmm, co říkáte na toto otřesné řešení pro použití předkompilované logiky?

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

Linux
  1. Jak spojit dva textové soubory v Linuxu

  2. extrahování jedinečných hodnot mezi 2 sadami/soubory

  3. Jak provedu binární rozdíl na dvou stejně velkých souborech pod Linuxem?

  1. Nástroje Linuxu, které mají zacházet se soubory jako se sadami a provádět na nich operace nastavení?

  2. Tisknout dva soubory ve dvou sloupcích?

  3. Jak najít soubory obsahující dva řetězce dohromady v Linuxu?

  1. Porovnat dva sloupce různých souborů a vytisknout, pokud se shodují?

  2. Linux – Jak smazat soubory vytvořené mezi dvěma časy?

  3. Společné řádky mezi dvěma soubory?