Самое простое, что вы можете использовать paste для объединения строк ваших файлов. Его опция -d позволяет вам выбрать разделитель (здесь, a .).
Трудная часть здесь - декартово произведение. Заимствуя из этого ответа на SO, мы можем придумать такую команду:
paste -d '.' \
  <(sed -n "$(yes 'p;' | head -n $(wc -l <file2.txt) )" file1.txt) \
  <(cat $(yes 'file2.txt' | head -n $(wc -l <file1.txt)))
Где мы:
- Объедините yesиheadдля создания сценарияsedкоторый будет печатать каждую строкуfile1.txtколичество раз, равное количеству строк вfile2.txt;
- Объедините yesиheadчтобыcatprintfile2.txtравнялся числу строк вfile1.txt;
- Используйте pasteчтобы объединить каждую пару строк, напечатанных двумя подстановками процесса (<(...)), разделенными символом.,
Конечно, вы можете передать результат в другие команды.
Также обратите внимание, что вы всегда можете передать вывод команд, даже если они находятся в цикле, как в этом другом вашем ответе . Например, попробуйте
while ... do ... done <file | cat -
Для удобства вы можете определить функцию и сделать ее доступной для вашей среды (например, определив ее в вашем .bashrc если вы используете bash).
Например, здесь используются циклы, чтобы минимизировать потребность во внешних инструментах:
function cart_prod () {
  while IFS= read -r line1; do
    while IFS= read -r line2; do
      printf '%s.%s\n' "$line1" "$line2"
    done <"$2"
  done <"$1"
}
Пример использования:
$ cart_prod file1.txt file2.txt | sort -r
cc.site.com
cc.site3.com
cc.site2.com
bb.site.com
bb.site3.com
bb.site2.com
aa.site.com
aa.site3.com
aa.site2.com