shell脚本:计算多个文件中的行和总和

时间:2016-11-17 16:08:38

标签: bash shell awk

我想计算 .CSV 文件中的行数,并将最后一个数字列相加。我需要为crontab制作此内容,因此,它必须是一个脚本。

此代码计算行数:

egrep -i String file_name_201611* | \
egrep -i "cdr,20161115" | \
awk -F"," '{print $4}' | sort | uniq | wc -l

此代码汇总了最后一列:

egrep -i String file_name_201611* | \
egrep -i ".cdr,20161115"| \
awk -F"," '{print $8}' | paste -s -d"+" | bc

行看起来像:

COMGPRS,CGSCO05,COMGPRS_CGSCO05_400594.dat,processed_cdr_20161117100941_00627727.cdr,20161117095940,20161117,18,46521

预期产出:

CGSCO05,sum_#_lines, Sum_$8
CGSCO05, 225, 1500

2 个答案:

答案 0 :(得分:0)

这应该有用......

#!/usr/bin/awk -f

BEGIN{
    k=0;
    FS=","
}
{
    if ($2 in counter){
        counter[$2] = counter[$2] + 1;
        sum_8[$2] = sum_8[$2] + $8;
    }else{
        k = k + 1;
        counter[$2] = 1;
        sum_8[$2] =  $8;
        name[k] = $2;
    }

}
END{
    for (i=1; i<=k; i++)
        printf "%s, %i, %i\n", name[k], counter[name[k]], sum_8[name[k]];
}

答案 1 :(得分:0)

按字段#2

sort CSV 文件,仅保留包含唯一条目的行,然后打印唯一行的数量,以及列#8中的sum那些独特的路线:

sort -t, -k2 -u foo.csv | datamash -t, count 2  sum 8