Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用awk循环读取每十行文件?_Linux_Awk - Fatal编程技术网

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

Linux 如何使用awk循环读取每十行文件?,linux,awk,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 我想读

我有一个文件,其中的行使用“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
我想读每十行,然后打印这十行中两个数字的平均值并打印出来


谢谢。

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

#/usr/bin/awk-f
开始{
区块大小=10;
首先求和=0;
和秒=0;
记录_计数器=0;
}
/[0-9]+\s+[0-9]+/{
记录_计数器+=1;
先求和+=1美元;
总和_秒+=$2;
if(记录\u计数器%chunk\u大小==0){
printf(“%16.9f%16.9f\n”,
首先求和/块大小,
总和(秒/块大小);
首先求和=0;
和秒=0;
}
}
示例数据的输出:

5.30000000005.70000000
4.500000000      4.900000000
5.500000000      5.500000000
输出

5.3 5.7
4.5 4.9
5.5 5.5
3.5 3.9
末尾只有6行数据,但被10除。请将您的要求更精确。

由于nu11po1n7er(如果我错拼了您的名字,请原谅)已删除了他们的答案,我将添加一个类似的答案

awk -vc="10" '{a+=$1+$2}!(--c){c=10;print a/c;a=0}END{if(c)print a/(10-c)}' file
输出 这将打印每十行字段1和字段2的平均值(这是我从OPs帖子/评论中收集的)。
如果不是以10的倍数完成,它将除以平均剩下的行数。

情况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
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.5
4.7
5.5
5.3 5.7
4.5 4.9
5.5 5.5
情景2:每10行每列打印两个平均值

awk 'NR%10!=0{tmp=tmp+$1+ $2}NR%10==0{tmp = tmp+ $1+$2; print tmp/20; tmp=0}' 1.t
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.5
4.7
5.5
5.3 5.7
4.5 4.9
5.5 5.5

请提供一些示例输入和输出。我已经添加了示例输入。不是第10行,但我想从文件中提取每十行,然后打印这十行的平均值。因此,分别显示每十行的平均值。例如,前十行包括以下数字: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 6 5 7 6 8 7 9 8 0 9 1 2 3 4,我想打印它们的平均值。你能把例子缩小到2或3,而不是10吗?我想你需要检查一下
output()
在结束部分再次调用之前刚刚被调用,以避免在文件中的行数为10的倍数时重复输出最后的值+1.有没有办法避免每次都声明函数?@fedorqui,我不明白你的评论。函数只声明一次。我的意思是,你可以把函数的定义移到主块之外,并给出参数。虚拟示例:
awk'函数r(d){print d+1}BEGIN{print“we start”}r($1)
而不是
awk'BEGIN{print“we start”}函数r(d){print d+1}r($1)
awk没有“主块”:。你的例子是一样的。第一个
awk'{tmp=tmp+$1+$2}NR%10==0{print tmp/20;tmp=0}'
第二个
awk'{tmp=tmp+$1;tmp2=tmp2+$2}NR%10==0{print tmp/10,tmp2/10;tmp=tmp2=0}'
@Jidder,smart
tmp+=$1+$2
而不是
tmp=tmp+$1+$2
ref@glenn。
+
的优先级高于
+=
的优先级。是的,我们应该发现这一点,只是想表明存在大量冗余代码:)