使用同一行上的两个值迭代文件

时间:2013-01-30 16:56:22

标签: bash shell unix

我需要传递一系列的夫妻值,这些值是c ++软件的参数。所以我写了这个剧本:

while read randomNumbers; do
                lambda = $randomNumbers | cut -f1 -d ' '
                mi = $randomNumbers | cut -f2 -d ' '
                ./queueSim mm1-queue $lambda $mi 
done < "randomNumbers"          

其中第一个arg是文件“randomNumbers”中每行的第一个值,第二个值是第二个值(当然)。我得到了段错误和“未找到命令”。

如何从行中分配lambda和mi valus并将此变量传递给c ++软件?

2 个答案:

答案 0 :(得分:4)

没有必要削减。让我们为您分割线:

while read lambda mi; do
    ./queueSim mm1-queue $lambda $mi 
done < randomNumbers

请注意,它通常与IFS结合使用,以在不同的字段上拆分输入行。例如,要解析/etc/passwd(带有冒号分隔行的文件),您将经常看到:

while IFS=: read username passwd uid gid info home shell; do ...

答案 1 :(得分:1)

我建议像这样分配值:

lambda=$(echo $randomNumbers | cut -f1 -d ' ')
mi=$(echo $randomNumbers | cut -f2 -d ' ')

按照你的方式,你实际上尝试运行一个名为$randomNumbers当前内容的命令。

修改 另一件事:由于您的列由空白字符分隔,您还可以将整行读入一个数组,其元素也由空格分隔。实现这一目标的一种方法是:

columns=( $(echo "$randomNumbers" | grep -o "[^ ]*") )
./queueSim mm1-queue ${columns[@]::2}

第一行匹配所有不包含任何空格的子串,并将它们放入数组columns。第二行与您实现中的相应行相同:将前两列作为参数插入。由于使用切片完成:您获取整个数组${columns[@]},但通过在右侧应用边界::2来选择它的某个子序列,该边界在columns的每个元素中返回左侧(位置0),不在位置>=2上。