Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 - Fatal编程技术网

Bash-对于每一行,求和[由参数]指示的列中出现的数字

Bash-对于每一行,求和[由参数]指示的列中出现的数字,bash,Bash,脚本将适当的列相加(即,每行将所示列中出现的数字相加),创建数字的结果列并将其写入stdout。在没有参数的情况下,“column”默认为第1列 用法:./script.sh文件名[列1…] 这就是每行的num之和 #!/bin/bash if [ $# -lt 2 ] then echo "Usage: ./script.sh filename [column1 column2 ...]" fi filename=$1 shift while read line do sum=0

脚本将适当的列相加(即,每行将所示列中出现的数字相加),创建数字的结果列并将其写入stdout。在没有参数的情况下,“column”默认为第1列

用法:./script.sh文件名[列1…]

这就是每行的num之和

#!/bin/bash

if [ $# -lt 2 ]
then
  echo "Usage: ./script.sh filename [column1 column2 ...]"
fi

filename=$1
shift

while read line
do
  sum=0
  for num in $line
  do
    let sum=sum+num
  done
  echo "Sum: " $sum
done < $filename
#/bin/bash
如果[$#-lt 2]
然后
echo“用法:./script.sh文件名[column1 column2…”
fi
文件名=$1
转移
读行时
做
总和=0
对于$line中的num
做
设sum=sum+num
完成
echo“Sum:$Sum
完成<$filename

如何对每一行的参数[column1 column2..]指示的列中出现的数字求和,并创建数字的结果列并将其写入stdout。请告诉我应该使用什么工具来解决此问题。

仅通过扩展现有脚本,类似的内容应该可以工作(未经测试):

#/bin/bash
如果[$#-lt 2];然后
echo“用法:./script.sh文件名[column1 column2…]”&退出1
#退出脚本-无需进一步处理
fi
[!-f$1]&&echo“给定的文件名不是有效的文件,正在退出”&&exit 1
文件名=$1&&shift
而[$#-ge 1];读取所有参数并将它们放入数组
toadd+=(“$1”)和移位
完成
而read-r行;是否从文件中读取行

read-ra专栏请告诉我应该使用什么工具来解决这个问题。awk
awk
很好。在没有
awk
的情况下,您可以使用一些工具(
cut
sed
)首先提取柱。当您不想循环使用
((sum+=i))
添加每个字段的剩余值时,您可以将所有内容连接到一行(
tr'\n'
),并再次使用
tr
将空格替换为“+”。现在您有了一个字符串,可以
|
bc
。谢谢@George_Vasiliou你的解决方案很有帮助
#!/bin/bash

if [ $# -lt 2 ];then
  echo "Usage: ./script.sh filename [column1 column2 ...]" &&  exit 1 
  #exit the script - no further processing
fi

[ ! -f $1 ] && echo "Filename given not a valid file-exiting" && exit 1

filename=$1 && shift 

while [ $# -ge 1 ];do    #Read all args and put them in an array
  toadd+=( "$1" ) && shift
done

while read -r line;do           #Read line from file
  read -ra columns <<<"$line"   #split the line into field using an array
  sum=0
  for i in "${toadd[@]}";do     #For items in array $toadd
    num="${columns[$i-1]}"      #get the corresponding element from array columns
    let sum=sum+num
  done

  echo "Sum: " $sum
done < $filename
exit 0