2014-11-06 89 views
0

我有一个任务: 编写一个脚本,用于存储在文件中的整数的总和。形成呼叫脚本: 示例:sum a.txt 3 4bash脚本中的awk过程

输入文件可以包含几列整数。单独的列是独立的选项卡或选项卡。该脚本应该总结适当的列并将结果写入标准输出。 所以当我们有“sum a.txt 3 4”时,我们需要添加第三和第四列文件的数量。

所以我这样做:

#!/bin/bash 
array1=("[email protected]") 
let LA=${#array1[@]}-1 
awk '{for(i=1;i<=$LA;i++)y+=$'${array1[i]}'; print y}' a.txt 

,但我有一个错误:AWK:1unexpected字符 ''

请帮忙有另一种方法来增加在过程调用脚本中给出数量的列的数量吗?

+0

你不能越过壳/ AWK边界的方式。可以使用shell循环和shell数组,也可以将所有值都推送到awk并使用awk数组。 (用'set -v'或'set -x'运行你的脚本来查看实际运行的内容以查看你当前的错误。) – 2014-11-06 18:37:23

回答

0

如果传递3个参数来总结

#!/bin/bash 
awk -v col1=$2 -v col2=$3 '{sum1 += $col1; sum2 += $col2} END{print sum1,sum2}' $1 

当脚本调用为sum a.txt 3 4,然后

$1 = a.txt 
$2 = 3 
$4 = 4 

编辑

如果列数可以改变

#!/bin/bash 

filename=$1 
cols=${@:2:$#} 

awk -v c="$cols" '{split(c, cols, " "); for (col in cols) sum[col]+=$col} END{for (i in sum) print sum[i]}' $filename 

说明

  • -v c="$cols"创建AWK可变c并通过列列表

  • split(c, cols, " ")分裂列列表c以获得阵列,COLS

  • for (col in cols) sum[col]+=$col为每列值在cols数组中找到总和,sum[col]+=$col

  • END{for (i in sum) print sum[i]}打印的sum阵列

+0

它不起作用 – 2014-11-06 19:01:36

+0

@LucynaIlczuk有没有一些错误? – nu11p01n73R 2014-11-06 19:03:34

+0

awk:行语法错误在或接近} – 2014-11-06 19:19:11