C-shell:如何从一行标准输入创建多个数组?

时间:2014-07-27 04:53:09

标签: arrays linux shell sed galois-field

我需要找到一种方法来使用C-shell完成以下任务(我不能使用不同的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 个答案:

答案 0 :(得分:1)

你可能想要下一个:

#!/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

它为每个(x x x x x)组创建数组1 ..数组。 对于你的字符串:

(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

答案 1 :(得分:0)

假设您在名为abc的文件中有多项式,则可以使用以下命令获取您要查找的输出。

cat abc | tr '\052' '\n'

如果你在变量中使用相同的res,那么你可以使用以下命令:

echo $res | tr '\052' '\n'