Лучшая альтернатива декартовому произведению в bash, безусловно, - как указывает @fedorqui - использовать расширение параметра. Однако в случае, если ваш ввод нелегко воспроизвести (т. е. если {1..3}
и {1..5}
недостаточно), вы можете просто использовать join
.
Например, если вы хотите выполнить декартово произведение двух обычных файлов, скажем, "a.txt" и "b.txt", вы можете сделать следующее. Сначала два файла:
$ echo -en {a..c}"\tx\n" | sed 's/^/1\t/' > a.txt
$ cat a.txt
1 a x
1 b x
1 c x
$ echo -en "foo\nbar\n" | sed 's/^/1\t/' > b.txt
$ cat b.txt
1 foo
1 bar
Обратите внимание, что команда sed
используется для добавления идентификатора к каждой строке. Идентификатор должен быть одинаковым для всех строк и для всех файлов, поэтому join
даст вам декартово произведение вместо того, чтобы отбрасывать некоторые результирующие строки. Итак, join
выглядит следующим образом:
$ join -j 1 -t $'\t' a.txt b.txt | cut -d $'\t' -f 2-
a x foo
a x bar
b x foo
b x bar
c x foo
c x bar
После того, как оба файла объединены, cut
используется в качестве альтернативы для удаления столбца «1», ранее добавленного в начало.
person
Rubens
schedule
29.04.2014