Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash脚本中将多个文件作为参数传递,并将其内容保存在两个数组中_Bash_Shell - Fatal编程技术网

在Bash脚本中将多个文件作为参数传递,并将其内容保存在两个数组中

在Bash脚本中将多个文件作为参数传递,并将其内容保存在两个数组中,bash,shell,Bash,Shell,我试着编写一个脚本,它可以获取多个文件作为输入。文件的每一行都有这样的形式“num1:num2”,我想将num1和num2保存在两个不同的数组中,然后计算总和 #!/bin/bash args=("$@") declare -a X declare -a Y for ((i=0; i<=${#args}; i++)) do input="${args[$i]}" let j=0 while IFS=: read x y do X+=("$x") Y+=("$y"

我试着编写一个脚本,它可以获取多个文件作为输入。文件的每一行都有这样的形式“num1:num2”,我想将num1和num2保存在两个不同的数组中,然后计算总和

#!/bin/bash

args=("$@")
declare -a X
declare -a Y
for ((i=0; i<=${#args}; i++)) do
  input="${args[$i]}"

let  j=0
while  IFS=: read x y
  do
   X+=("$x")
   Y+=("$y")
   let j=j+1
 done < "$input"
  sumx=0
  sumx2=0
  sumy=0
  a=0
  sumxy=0
  b=0
  err=0
  for ((k=0; k<j; k++)) do
    sumx=  $(echo "scale=3; sumx + X[$k]" | bc -l)
    sumx2= $(echo "scale=3;sumx2 + X[$k]^2" | bc -l)
    sumy=  $(echo "scale=3;sumy + Y[$k]" | bc -l)
    sumxy=  $(echo "scale=3;sumxy + X[$k]*Y[$k]" | bc -l)
  done
  echo "$sumx"
done
#/bin/bash
args=(“$@”)
声明-a X
宣布-a为Y

为了((i=0;i
awk
救援

因为您没有发布任何示例输入,所以让我们创建一些

$ seq 10 | paste -d: - - | tee file1 file2

$ head file{1,2}
==> file1 <==
1:2
3:4
5:6
7:8
9:10

==> file2 <==
1:2
3:4
5:6
7:8
9:10
或者,添加其他计算

$ awk -F: '{sum1+=$1; sum2+=$2; sumsq1+=$1^2; sum12+=$1*$2} 
       END {print sum1,sum2,sumsq1,sum12}' file{1,2}

50 60 330 380

awk
救援

因为您没有发布任何示例输入,所以让我们创建一些

$ seq 10 | paste -d: - - | tee file1 file2

$ head file{1,2}
==> file1 <==
1:2
3:4
5:6
7:8
9:10

==> file2 <==
1:2
3:4
5:6
7:8
9:10
或者,添加其他计算

$ awk -F: '{sum1+=$1; sum2+=$2; sumsq1+=$1^2; sum12+=$1*$2} 
       END {print sum1,sum2,sumsq1,sum12}' file{1,2}

50 60 330 380

@karakfa已经在
awk
中展示了一种更好的方法;我想尝试一下修复bash版本。主要问题是一些基本语法错误:

首先,在循环中:

for ((i=0; i<=${#args}; i++)) do
第二和第三,在计算行中

sumx=  $(echo "scale=3; sumx + X[$k]" | bc -l)
…您不能在
=
符号后放置空格(它们完全改变了命令的含义),而且变量引用需要
$
(对于数组元素,
${}
)来告诉shell替换它们:

sumx=$(echo "scale=3; $sumx + ${X[$k]}" | bc -l)
这就是导致您收到错误消息的原因。
bc
不知道shell变量;它只是将
sumx
视为未初始化的
bc
变量,但是
X[1]
无效
bc
语法(注意,
$k
将被替换)

如果您实际上是在shell中执行此操作(而不是
awk
),我还建议通过删除数组来简化此操作。将文件内容读入数组,然后在可以边读边计算的情况下迭代数组是没有意义的:

while IFS=: read x y; do
    sumx=$(echo "scale=3; $sumx + $x" | bc -l)
    sumx2=$(echo "scale=3; $sumx2 + $x^2" | bc -l)
    sumy=$(echo "scale=3; $sumy + $y" | bc -l)
    sumxy=$(echo "scale=3; $sumxy + $x*$y" | bc -l)
done < "$input"
当IFS=:读取x y;执行
sumx=$(回声“标度=3;$sumx+$x”| bc-l)
sumx2=$(回声“刻度=3;$sumx2+$x^2”| bc-l)
sumy=$(echo“scale=3;$sumy+$y”| bc-l)
sumxy=$(回声“刻度=3;$sumxy+$x*$y”| bc-l)
完成<“$input”

@karakfa已经在
awk
中展示了一种更好的方法;我想尝试一下修复bash版本。主要问题是一些基本语法错误:

首先,在循环中:

for ((i=0; i<=${#args}; i++)) do
第二和第三,在计算行中

sumx=  $(echo "scale=3; sumx + X[$k]" | bc -l)
…您不能在
=
符号后放置空格(它们完全改变了命令的含义),而且变量引用需要
$
(对于数组元素,
${}
)来告诉shell替换它们:

sumx=$(echo "scale=3; $sumx + ${X[$k]}" | bc -l)
这就是导致您收到错误消息的原因。
bc
不知道shell变量;它只是将
sumx
视为未初始化的
bc
变量,但是
X[1]
无效
bc
语法(注意,
$k
将被替换)

如果您实际上是在shell中执行此操作(而不是
awk
),我还建议通过删除数组来简化此操作。将文件内容读入数组,然后在可以边读边计算的情况下迭代数组是没有意义的:

while IFS=: read x y; do
    sumx=$(echo "scale=3; $sumx + $x" | bc -l)
    sumx2=$(echo "scale=3; $sumx2 + $x^2" | bc -l)
    sumy=$(echo "scale=3; $sumy + $y" | bc -l)
    sumxy=$(echo "scale=3; $sumxy + $x*$y" | bc -l)
done < "$input"
当IFS=:读取x y;执行
sumx=$(回声“标度=3;$sumx+$x”| bc-l)
sumx2=$(回声“刻度=3;$sumx2+$x^2”| bc-l)
sumy=$(echo“scale=3;$sumy+$y”| bc-l)
sumxy=$(回声“刻度=3;$sumxy+$x*$y”| bc-l)
完成<“$input”

错误是什么?(标准中)1:语法错误错误是什么?(标准中)1:语法错误问题并不完全清楚,但我认为目标是为每个文件打印单独的总计。如果这是正确的,可以用纯
awk
完成,但可能更容易将
awk
包装在shell循环中:
用于“$@”中的输入问题并不完全清楚,但我认为目标是为每个文件打印单独的总计。如果这是正确的,可以在纯
awk
中完成,但在shell循环中包装
awk
可能更容易:
用于“$@”中的输入;doawk-F:“$input”完成