以bash独立计算偶数和奇数行的均值

时间:2019-06-17 16:55:07

标签: bash

我有一个2列多行的文件。我想独立地为奇数行和偶数行计算每列的平均值,以便最终我得到一个具有4个值的文件:2列具有奇数和偶数均值的列。 我的文件如下:

2 4 4 4 6 8 3 5 6 9 2 1

最后,我想获得一个文件,第一列的平均值为2,6,6和4,3,2,第二列的平均值为4,8,9和4,5,1列,即:

4.66 7 3 3.33

如果有人可以给我一些建议,我将不胜感激,目前,我只能计算所有行的均值(而不是偶数和奇数)。提前非常感谢您!

3 个答案:

答案 0 :(得分:2)

这是一个awk 硬编码示例,但您可以理解这一点:

awk 'NR%2{e1+=$1;e2+=$2;c++;next}
     {o1+=$1;o2+=$2;d++}
     END{print e1/c"\t"e2/c"\n"o1/d"\t"o2/d}' your_file
4.66667 7
3       3.33333

答案 1 :(得分:1)

Juan Diego Godoy的答案的更广义版本。依靠GNU awk

gawk '
    {
        parity = NR % 2 == 1 ? "odd" : "even"
        for (i=1; i<=NF; i++) {
            sum[parity][i] += $i
            count[parity][i] += 1
        }
    }
    function result(parity) {
        for (i=1; i<=NF; i++)
            printf "%g\t", sum[parity][i] / count[parity][i]
        print ""
    }
    END { result("odd"); result("even") }
'

答案 2 :(得分:0)

此答案使用Bash和bc。假定输入文件仅包含整数,并且行数为偶数。

#!/bin/bash
while read -r oddcol1 oddcol2; read -r evencol1 evencol2
do
    (( oddcol1sum += oddcol1 ))
    (( oddcol2sum += oddcol2 ))
    (( evencol1sum += evencol1 ))
    (( evencol2sum += evencol2 ))
    (( count++ ))
done < inputfile

cat <<EOF | bc -l
    scale=2
    print "Odd Column 1 Mean: "; $oddcol1sum / $count
    print "Odd Column 2 Mean: "; $oddcol2sum / $count
    print "Even Column 1 Mean: "; $evencol1sum / $count
    print "Even Column 2 Mean: "; $evencol2sum / $count
EOF

可以对其进行修改以使用数组以使其更加灵活。