在Bash脚本中将多个文件作为参数传递,并将其内容保存在两个数组中
我试着编写一个脚本,它可以获取多个文件作为输入。文件的每一行都有这样的形式“num1:num2”,我想将num1和num2保存在两个不同的数组中,然后计算总和在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"
#!/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;iawk
救援
因为您没有发布任何示例输入,所以让我们创建一些
$ 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”完成