Лучшей альтернатива для декартова продукта в Баше, безусловно, - как указана @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», ранее предваряется.
делает {1..3} расширять оболочкой? –
Да, '{1..3}' такой же, как 'seq 3' или' seq 1 3', просто он поставляется с оболочкой. – fedorqui
есть ли какой-либо другой с помощью пасты? –