我有一个文件,其中使用" 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
我想读取每十行,然后打印这十行中的两个数字的平均值并打印。
感谢。
答案 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