Самое простое, что вы можете использовать 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 чтобы cat print file2.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