bash - Todas as combinações possíveis de palavras de diferentes arquivos

3

Eu tenho arquivos n com uma palavra por linha

file 1    file 2   file 3 ...
1_a       2_a       3_a
1_b       2_b       3_b
1_c                 3_c

Eu quero escrever um script que tome todos esses arquivos e gere toda a combinação possível de n palavras (uma de cada arquivo).

No meu exemplo, quero este resultado:

1_a 2_a 3_a
1_a 2_a 3_b
1_a 2_a 3_c
1_a 2_b 3_a
1_a 2_b 3_b
1_a 2_b 3_c
1_b 2_a 3_a
1_b 2_a 3_b
1_b 2_a 3_c
1_b 2_b 3_a
1_b 2_b 3_b
1_b 2_b 3_c
1_c 2_a 3_a
1_c 2_a 3_b
1_c 2_a 3_c
1_c 2_b 3_a
1_c 2_b 3_b
1_c 2_b 3_c

Eu tentei fazer isso com paste e awk, mas falhei. Como posso fazer isso?

    
por Fabich 14.04.2016 / 17:19

2 respostas

6

Você pode usar uma função recursiva que chama a si mesma enquanto houver arquivos para processar:

#!/bin/bash

process () {
    local prefix=$1
    local file=$2
    shift 2
    while read line ; do
        if (($#)) ; then                  # There are still unprocessed files.
            process "$prefix $line" "$@"
        else                              # Reading the last file.
            printf '%s\n' "$prefix $line"
        fi
    done < "$file"
}

process '' "$@"
    
por 14.04.2016 / 17:31
1

Eu sei que você disse bash , mas isso é perfeitamente adequado para uma linguagem como python 3.3+

import sys
from contextlib import ExitStack
from itertools import product

with ExitStack() as stack:
  files = [stack.enter_context(open(f)) for f in sys.argv[1:]]
  for x in product(*files):
    x = [y.rstrip('\n') for y in x]
    print(*x)

Coloque o código acima em um arquivo chamado combo.py e chame-o assim python combo.py file_1 file_2 file_3 Gera

1_a 2_a 3_a
1_a 2_a 3_b
1_a 2_a 3_c
1_a 2_b 3_a
1_a 2_b 3_b
1_a 2_b 3_c
1_b 2_a 3_a
1_b 2_a 3_b
1_b 2_a 3_c
1_b 2_b 3_a
1_b 2_b 3_b
1_b 2_b 3_c
1_c 2_a 3_a
1_c 2_a 3_b
1_c 2_a 3_c
1_c 2_b 3_a
1_c 2_b 3_b
1_c 2_b 3_c
    
por 14.04.2016 / 23:36