Решение python
. Входной файл передается в itertools.combinations
из стандартной библиотеки, которая генерирует 2 кортежа длины -, которые форматируются и печатаются на стандартный вывод.
python3 -c 'from itertools import combinations
with open("file") as f:
lines = (line.rstrip() for line in f)
lines = ("{} {}".format(x, y) for x, y in combinations(lines, 2))
print(*lines, sep="\n")
'
Чтобы разделить строку на массив, вы можете использовать оператор split+glob (, который вызывается, когда вы оставляете раскрытие параметра без кавычек в контексте списка):
test_var=ab_c_de_fg_.txt
root_name=${test_var%.*} # remove extension
IFS=_ # split on _
set -o noglob # disable glob part
array=( $root_name"" ) # split+glob, preserve empty trailing element if any
typeset -p array
будет показывать что-то вроде:
typeset -a array=(ab c de fg '')
Чтобы объединить элементы массива с первым символом (байта в ksh )из $IFS
, вы делаете "${array[*]}"
.
Так:
printf '%s\n' "${array[*]:0:2}" "${array[*]:2}"
Будет вывод:
ab_c
de_fg_
И ваши две переменные могут быть определены как:
first_part="${array[*]:0:2}" second_part="${array[*]:2}"
Вот один из способов сделать то, о чем просит ваш вопрос вbash
(и игнорировать ваш код, так как я не могу понять, что вы пытаетесь с ним сделать):
$ test_var=ab_c_de_fg_.txt
$ read var1 var2 < <(echo "$test_var" | sed 's/_/ /2; s/\.txt$//')
$ echo "$var1"
ab_c
$ echo "$var2"
de_fg_
В сценарии это будет просто:
test_var=ab_c_de_fg_.txt
read var1 var2 < <(echo "$test_var" | sed 's/_/ /2; s/\.txt$//')
Теперь у вас есть $var1
и $var2
.
Хитрость заключается в использовании read
для чтения двух переменных. Это разделит его ввод на текущее значение переменной среды IFS
(, которая по умолчанию представляет собой пробел, табуляцию и новую строку ). Команда sed
заменит 2-й _
пробелом(s/_/ /2
)и удалит .txt
из конца своего ввода (s/\.txt$//
), поэтому то, что передается в read
, будет ab_c de_fg_.txt
, и потому что посередине есть пробел, каждая строка сохраняется в соответствующей переменной.