如何使用awk in循环读取每十行文件?

时间:2014-12-01 19:43:32

标签: linux awk

我有一个文件,其中使用" return"分隔行。我想使用两个循环,一个循环用于读取每十行,一个循环用于对特定的十行进行特定操作。如何使用awk读取文件中的每十行?

示例文件是:

1 2
3 4
5 6
7 8
9 10
9 10
7 8
6 5
4 3
2 1
2 1
4 3
5 4
6 5
7 6
8 7
9 8
0 9
1 2
3 4
5 6
7 8
9 10
9 10
7 8
6 5
4 3
2 1
2 1
4 3
5 4
6 5
7 6
8 7
9 8
0 9

我想读取每十行,然后打印这十行中的两个数字的平均值并打印。

感谢。

4 个答案:

答案 0 :(得分:2)

awk '
    {sum1 += $1; sum2 += $2} 
    function output() {print sum1/10, sum2/10; sum1 = sum2 = 0} 
    NR % 10 == 0 {output()} 
    END {output()}
' input.file

输出

5.3 5.7
4.5 4.9
5.5 5.5
3.5 3.9

END只有6行数据,但除以10.请使您的要求更精确。

答案 1 :(得分:0)

一种可能的解决方案是检查计数器并输出并重置每列的当前总和,如果计数器达到10的倍数。请注意,如果总行数不是10的倍数,这将吞下最后几个记录如果您确定您的文件不包含任何空白行,则可以进一步简化代码。

#!/usr/bin/awk -f

BEGIN {
    chunk_size = 10;
    sum_first = 0;
    sum_second = 0;
    record_counter = 0;
}

/[0-9]+\s+[0-9]+/ {
    record_counter += 1;
    sum_first += $1;
    sum_second += $2;
    if (record_counter % chunk_size == 0) {
        printf("%16.9f %16.9f\n",
               sum_first / chunk_size,
               sum_second / chunk_size);
        sum_first = 0;
        sum_second = 0;
    }
}

示例数据的输出:

     5.300000000      5.700000000
     4.500000000      4.900000000
     5.500000000      5.500000000

答案 2 :(得分:0)

作为nu11po1n7er(对不起,如果我拼错了你的名字)已经删除了他们的答案我将添加一个类似的

awk -vc="10" '{a+=$1+$2}!(--c){c=10;print a/c;a=0}END{if(c)print a/(10-c)}' file

输出

11
9.4
11
12.3333

这将打印每十行第一和第二行的平均值(这是我从OP发布/评论中收集的)。 如果它没有达到10的倍数,那么它将除以平均剩余许多行。

答案 3 :(得分:0)

情况1:每10行只打印一个ave。

awk 'NR%10!=0{tmp=tmp+$1+ $2}NR%10==0{tmp = tmp+ $1+$2; print tmp/20; tmp=0}' 1.t

输出:

5.5
4.7
5.5

情境2:为每10行的每一列打印两个平均值。

awk 'NR%10!=0{tmp=tmp+$1; tmp2=tmp2+$2}NR%10==0{tmp = tmp+ $1; tmp2=tmp2+$2; print tmp/10, tmp2/10; tmp=tmp2=0}' 1.t

输出:

5.3 5.7
4.5 4.9
5.5 5.5