Этот вопрос тесно связан с этим и с этим вопросом. У меня есть файл, который содержит несколько строк, где каждая строка представляет собой путь к файлу. Теперь я хочу , чтобы соединить каждую строку с каждой иной линией (не сам). Также пара для моих целей A B
равна B A
паре, поэтому должна быть получена только одна из этих комбинаций.
пример
files.dat
читается как это в сокращенной записи, каждая буква представляет собой путь к файлу (абсолютный или относительный)
a
b
c
d
e
Тогда мой результат должен выглядеть примерно так:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Желательно, чтобы я решил это в bash. В отличие от других вопросов, мой список файлов довольно мал (около 200 строк), поэтому использование циклов и объема оперативной памяти не представляет проблем.
Ответы:
Используйте эту команду:
PROCINFO
может бытьgawk
продолжением. Если вашawk
не поддерживает его, просто пропуститеPROCINFO["sorted_in"] = "@ind_str_asc"
строку и направьте вывод вsort
(если вы хотите, чтобы вывод был отсортирован).(Это не требует сортировки входных данных.)
источник
Это предполагает, что ни одна строка во входном файле не содержит пробелов. Также предполагается, что файл отсортирован .
Команда
join
создает полное перекрестное произведение строк в файле. Это делается путем соединения файла с самим собой на несуществующем поле. Нестандартный-j 2
может быть заменен на-1 2 -2 2
(но не на,-j2
если вы не используете GNUjoin
).Команда
awk
читает результат этого и выводит только те результаты, которые еще не были просмотрены.источник
sort -b
бы сортировал.join
требуют отсортированные входные файлы.python
Раствор. Входной файл подаетсяitertools.combinations
из стандартной библиотеки, которая генерирует кортежи длиной 2, которые форматируются и печатаются в стандартный вывод.источник
Если вы
ruby
установили:-0777
хлебать весь файл (должно быть в порядке, так как в OP указано, что размер файла небольшой)-F'\n'
разделить на основе новой строки, поэтому каждая строка будет элементом в$F
массиве$F.combination(2)
генерировать комбинации2
элементов одновременно{ |c| puts c.join(" ")}
распечатывать по мере необходимости$F.uniq.combination(2)
для 3 элементов одновременно:
С
perl
(не универсальный)С
awk
источник
Вот один в чистой оболочке.
Пример:
источник
<file.dat xargs test.sh
чемtest.sh $(cat file.dat)
Используя
Perl
мы можем сделать это как показано:источник