Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
Bash 特定行下方的Awk计算平均行数_Bash - Fatal编程技术网

Bash 特定行下方的Awk计算平均行数

Bash 特定行下方的Awk计算平均行数,bash,Bash,我在使用awk计算特定文本标识符下面列中特定数字的平均值时遇到问题。我有两列数据,我试图在一个重复的公共标识符上开始平均键控,它是01/1991。因此,awk应计算从1991年1月开始的所有行的平均值,该值重复,使用下一个21行,1991-2012年的总行数平均值=22。所需输出是1991-2012年1月(01)所有文本ID/名称条目的平均值,如下所示: TextID/Name 1 平均值:50.34 TextID/Name 2 平均值:45.67 TextID/Name 3 平均值:39.97

我在使用awk计算特定文本标识符下面列中特定数字的平均值时遇到问题。我有两列数据,我试图在一个重复的公共标识符上开始平均键控,它是01/1991。因此,awk应计算从1991年1月开始的所有行的平均值,该值重复,使用下一个21行,1991-2012年的总行数平均值=22。所需输出是1991-2012年1月(01)所有文本ID/名称条目的平均值,如下所示:

TextID/Name 1 平均值:50.34 TextID/Name 2 平均值:45.67 TextID/Name 3 平均值:39.97

样本数据:

TextID/Name 1
01/1991, 57.67
01/1992, 56.43
01/1993, 49.41
..
01/2012, 39.88
TextID/Name 2
01/1991, 45.66
01/1992, 34.77
01/1993, 56.21
..
01/2012, 42.11
TextID/Name 3
01/1991, 32.22
01/1992, 23.71
01/1993, 29.55
..
01/2012, 35.10
continues with the same data for TextID/Name 4
我用下面显示的代码得到了答案,但平均值开始在特定标识符行之前计算,而不是在该行上下(01/1991)


非常感谢您对解决方案的解释!我已经对原始答案进行了编辑,并提供了更多说明-再次感谢。

如果允许您使用Perl而不是Awk,您可以:

#!/usr/bin/env perl

$start = 0;
$have_started = 0;
$count = 0;
$sum = 0;

while (<>) {
  $line = $_;

  # Grab the value after the date and comma
  if ($line = /\d+\/\d+,\s+([\d\.]+)/) {
    $val = $+;
  }

  # Start summing values after 01/1991
  if (/01\/1991,\s+([\d\.]+)/) {
    $have_started = 1;
    $val = $+;
  }

  # If we have started counting,
  if ($have_started) {
    $count++;
    $sum += $+;
  }
}

print "Average of all values = " . $sum/$count;

如果查看文件,第一个字段是“01/1991”,末尾是逗号,而不是“01/1991”。另外,NR%22==0将查看可被22整除的行号,而不是它认为您关心的点后的22行

您可以这样做:

awk '
  BEGIN { l=-1; }
  $1 == "01/1991," { 
    l=22; 
    s=0; 
  }  

  l > 0 { s+=$2; l--; }
  l == 0 { print s/22; l--; }'
它有一个计数器l,它将其设置为要计数的行数,然后将该行数相加


你可能想简单地把一行从01到1991的所有行相加,这可能更健壮。 我想你需要

awk'$1==”…
$1=“xxx”
分配给字段1。祝你好运。谢谢你的回答,但我这样做时,平均值会计算为零。关于
$1=“01/1991“这是因为它是一个赋值,所以它将始终为真,并且所有记录都将处理
sum+=$2`。如果你把你的问题再充实一点,也许会有帮助。目前我们不知道您为什么选择了22个(我可以猜),更重要的是,我们不知道您想要的输出,也不知道您现有输出的真实情况。或者,您可以在所有变量上添加一些print语句,自己调试问题。祝你好运
$ cat your-text-file.txt | above-perl-script.pl
awk '
  BEGIN { l=-1; }
  $1 == "01/1991," { 
    l=22; 
    s=0; 
  }  

  l > 0 { s+=$2; l--; }
  l == 0 { print s/22; l--; }'