C-shell: Как создать несколько массивов из одной строки стандартного ввода?
Мне нужно найти способ выполнить следующую задачу с помощью C-shell (я не могу использовать другую оболочку):
Существует программа, которая выводит полиномиальные множители из большего полинома, используя вычисления в поле Галуа. Выходные данные представляют собой одну строку и выглядят примерно так (не обращайте внимания на фактическое значение чисел; я выбрал их случайным образом, и они математически не работают):
(0 1 4 6 7 8 11 12 13) = (0 1)^3 * (0 4 5) * (0 2 4 6)^4 * (0 2 3)^2
То, как работает полиномиальная математика, если фактор увеличивается до четного числа, то этот фактор является лишним по сравнению со значением полинома. Вроде как умножение на 1. Что мне нужно сделать, это извлечь полиномиальные факторы и устранить лишние факторы.
Используя sed, я смог изменить приведенное выше выражение в виде
(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2
но я не уверен, как поступить.
Я хочу взять вышеизложенное, ввести его в скрипт C-shell и сделать следующие назначения массива:
Array A = (0 1)
Array B = (0 4 5)
Я думаю, что лучшим способом было бы сначала разделить полиномиальные факторы на отдельные строки, например так:
(0 1) ^ 3
(0 4 5)
(0 2 4 6) ^ 4
(0 2 3) ^ 2
но я не уверен, как это сделать.
Кто-нибудь может предоставить полезную помощь или советы? Имейте в виду, что число полиномиальных факторов изменится, но я не ожидаю, что их когда-либо будет больше 8. Значения экспоненты несущественны; Мне нужно только определить, являются ли они четными или нечетными. Я могу легко сделать это, если они назначены на переменную или массив. Максимально возможный размер одного фактора, вероятно, составляет около 50 чисел индивидов в скобках.
2 ответа
Вы, вероятно, хотите что-то вроде следующего:
#!/bin/tcsh
set str="(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2"
echo "My string: ===$str==="
set arrnum = 0
foreach line ( "`echo '$str' | grep -oP '\([^)]*\)'`" )
@ arrnum++
set eval_line = "set array$arrnum = $line"
eval "$eval_line"
end
echo "created $arrnum arrays (array1 .. array$arrnum)"
foreach i (`seq $arrnum`)
set arrname = "array$i"
echo "The content of $arrname"
set temp = `eval echo '$'$arrname`
foreach item ( $temp )
echo $item
end
end
Это создает массив1 .. массив N для каждого (x x x x x)
группа. Для вашей строки:
(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2
печать
My string: ===(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2===
created 4 arrays (array1 .. array4)
The content of array1
0
1
The content of array2
0
4
5
The content of array3
0
2
4
6
The content of array4
0
2
3
Предполагая, что у вас есть многочлен в файле с именем abc, вы можете использовать следующую команду, чтобы получить результат, который вы ищете.
cat abc | tr '\052' '\n'
Если у вас есть то же самое в переменной скажем res, то вы можете использовать следующую команду:
echo $res | tr '\052' '\n'