Intereting Posts
Замена зашифрованного пароля Изменить код выхода с 0 на 1 в сценарии bash Будет ли zgrep рекурсивно искать zip-файлы, встроенные в zip-файлы? Скопировать и вставить через выход из системы / перезагрузка? NFS продолжает беспорядочно разбиваться, ломает монтирование на других клиентах Не удается активировать HDMI на ноутбуке (у которого есть Optimus / шмель) Почему команда копирования редактора vi называется Yank? Ошибочно превратил файл в двоичный Добавление распакованных файлов в ZIP-папку Безопасно ли отключать пароль для пользователя, если он использует только SSH-ключ? Требуется ли sshd для использования на персональном компьютере? Как остановить emacs от окраски текста файла, который я редактирую? Преобразование всех первых символов в идентификатор электронной почты в верхний регистр в BASH Совместное подключение к Интернету с компьютера на новый маршрутизатор Насколько широко используется Polkit?

bash – Все возможные комбинации слов из разных файлов

У меня есть n файлов с одним словом на строку

  файл 1 файл 2 файл 3 ...
 1_a 2_a 3_a
 1_b 2_b 3_b
 1_c 3_c

Я хочу написать сценарий bash, который принимает все эти файлы и генерирует всю возможную комбинацию из n слов (по одному от каждого файла).

В моем примере я хочу получить такой результат:

 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

Я пытался сделать это с помощью пасты и awk, но я потерпел неудачу. Как я могу это сделать ?

Вы можете использовать рекурсивную функцию, которая вызывает себя, когда есть файлы для обработки:

#!/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 '' "$@" 

Я знаю, что вы сказали bash но это отлично подходит для такого языка, как 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) 

Поместите код выше в файл combo.py и вызовите его, таким образом, python combo.py file_1 file_2 file_3 Он генерирует

 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