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, но я потерпел неудачу. Как я могу это сделать ?

2 Solutions collect form web for “bash – Все возможные комбинации слов из разных файлов”

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

#!/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 
  • Предсказание PID ранее начатой ​​команды SSH
  • назначить комбинацию клавиш для запуска скрипта
  • Shell Script не может управлять командой man
  • Как удалить символ точки из строки без вызова sed или awk снова?
  • Требуется один лайнер: остановите httpd, если он уже запущен, и запустите httpd, если он не запущен
  • Основной скрипт в Angstrom Linux работает на Beaglebone Black
  • Создайте .tar.gz из каталога, опуская некоторые подкаталоги и добавляя только новые или измененные файлы
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Как я могу удалить файл защиты, сделанный tee?
  • sed, как заменить, когда в строке есть «http: //»?
  • Как удалить повторяющиеся строки из файла?
  • Interesting Posts

    причина сбоя операции ввода-вывода файла = -1 EACCES (разрешение отклонено)

    Запуск команд, хранящихся в переменных оболочки

    Почему загрузка в меню режима спасения ничего не делает?

    Совместное использование Windows / Unix

    Найти изображения с одинаковой временной отметкой exif

    Может ли LXC использоваться для помещения в тюрьму экземпляров установленного браузера?

    Количество экранов X, соответствующих количеству разделов «Экран» в файле xorg.conf для конфигурации с несколькими мониторами

    Как я могу удалить пакеты-сироты в Fedora?

    Установка / установка Fedora

    Перезагрузка xserver-xorg-input-mouse

    Есть ли способ отправить команду из удаленного сеанса ssh на ваш локальный компьютер?

    Какой лучший дистрибутив для Toshiba Satellite L10-205 (старое оборудование) используется в основном для разработки?

    Почему thepiratebay.se показывает содержимое /var/www/index.html?

    В чем разница между кэшированной памятью и используемой памятью?

    MC (Midnight Commander) Полный путь в строке заголовка внутреннего редактора

    Linux и Unix - лучшая ОС в мире.