Генерация перестановок лиц / строк с использованием bash - PullRequest
1 голос
/ 10 июля 2020

У меня есть файл с именами. Каждая линия представляет собой связь между людьми. Но также может быть только одно имя в строке.

Donald Duck;Daisy Duck;Della Duck;
Fethry Duck;Dudly D. Duck;Donald Duck;
Della Duck;Dudly D. Duck;Moby Duck;
Dugan Duck;Donald Duck;Dimwitty Duck;Whitewater Duck;
Lonesome Duck;

Я бы хотел переставить строки. Результат должен быть похож на

Donald Duck;Daisy Duck
Donald Duck;Della Duck
Daisy Duck;Della Duck
Fethry Duck;Dudly D. Duck
Fethry Duck;Donald Duck
Dudly D. Duck;Donald Duck
Della Duck;Dudly D. Duck
Della Duck;Moby Duck
Dudly D. Duck;Moby Duck
Dugan Duck;Donald Duck
Dugan Duck;Dimwitty Duck
Dugan Duck;Whitewater Duck
Donald Duck;Dimwitty Duck
Donald Duck;Whitewater Duck
Dimwitty Duck;Whitewater Duck
Lonesome Duck;

Решение, представленное на Генерация перестановок с использованием bash не учитывает слова, а отдельные символы.

1 Ответ

2 голосов
/ 10 июля 2020

Кажется, вам нужно по 2 комбинации имен в каждой строке. Скрипт bash для этого может быть примерно таким:

#!/bin/bash

while IFS=\; read -r -a names; do
    if ((${#names[@]} == 1)); then # if we have only one name, just echo it
        echo "${names[0]}"
    else
        for ((i = 0; i < ${#names[@]} - 1; ++i)); do
            for ((j = i + 1; j < ${#names[@]}; ++j)); do
                echo "${names[i]};${names[j]}"
            done
        done
    fi
done < names.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...