bash脚本中的awk过程

时间:2014-11-06 18:34:50

标签: bash awk

我有一个任务: 编写一个脚本,用于存储在文件中的整数求和。形成一个调用脚本: 例如:总和a.txt 3 4

输入文件可以包含多个整数列。单个列是单独的选项卡或标签。该脚本应该将适当的列相加并将结果写入stdout。 所以,当我们有"总和a.txt 3 4"我们需要添加第三和第四列文件的编号。

所以我这样做:

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

但我有一个错误:awk :: 1unexpected character&#39;。&#39;

请帮助有另一种方法来添加过程调用脚本中给出其编号的列数吗?

1 个答案:

答案 0 :(得分:0)

如果您将3个参数传递给sum

#!/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]+=$colcols数组中的每个列值找到总和,sum[col]+=$col

  • END{for (i in sum) print sum[i]}打印sum数组