Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
如何通过使用awk忽略包含字符的行来查找字段的最大值?_Awk - Fatal编程技术网

如何通过使用awk忽略包含字符的行来查找字段的最大值?

如何通过使用awk忽略包含字符的行来查找字段的最大值?,awk,Awk,由于我是awk的新手,请帮我提建议。我尝试使用下面的命令过滤最大值,并分别忽略示例文本文件中的第一行和最后一行。当我分别尝试它们时,它们会起作用 我的问题是: 我需要忽略文件中的最后一行和前几行,然后需要使用awk获取字段7的最大值 我还需要忽略带有字符的行。有人能给我建议两种可能性吗?它们一起使用这两个命令并获得所需的输出 示例文件: Linux 3.10.0-957.5.1.el7.x86_64 (j051s784) 11/24/2020 _x86_64_

由于我是
awk
的新手,请帮我提建议。我尝试使用下面的命令过滤最大值,并分别忽略示例文本文件中的第一行和最后一行。当我分别尝试它们时,它们会起作用

我的问题是:

我需要忽略文件中的最后一行和前几行,然后需要使用awk获取字段7的最大值

我还需要忽略带有字符的行。有人能给我建议两种可能性吗?它们一起使用这两个命令并获得所需的输出

示例文件:

Linux 3.10.0-957.5.1.el7.x86_64 (j051s784)      11/24/2020      _x86_64_        (8 CPU)

 

12:00:02 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty

12:10:01 AM   4430568  61359128     93.27   1271144  27094976  66771548     33.04  39005492  16343196      1348

12:20:01 AM   4423380  61366316     93.28   1271416  27102292  66769396     33.04  39012312  16344668      1152

12:30:04 AM   4406324  61383372     93.30   1271700  27108332  66821724     33.06  39028320  16343668      2084

12:40:01 AM   4404100  61385596     93.31   1271940  27107724  66799412     33.05  39031244  16344532      1044

06:30:04 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty

07:20:01 PM   3754904  62034792     94.29   1306112  27555948  66658632     32.98  39532204  16476848      2156

Average:      4013043  61776653     93.90   1293268  27368986  66755606     33.03  39329729  16427160      2005
使用的命令:

cat testfile | awk '{print $7}'  | head -n -1 | tail -n+7
预期产出:

Maximum value for the column 7 by excluding the lines wherever alphabet character is available
1st solution(Generic solution):在此处添加一个Generic solution,其中将字段名发送到
awk
变量(我们希望查找最大值),它将自动从第一行找到其字段号,并相应地工作。考虑到您的第一行具有您要查找的字段名

awk -v var="kbcached" '
FNR==1{
  for(i=1;i<=NF;i++){
   if($i==var){ field=i }
  }
  next
}
/kbmemused/{
  next
}
{
  if($2!~/^[AP]M$/){
    val=$(field-1)
  }
  else{
    val=$field
  }
}
{
  max=(max>val?max:val)
  val=""
}
END{
  print "Maximum value is:" max
}
' Input_file
一艘班轮:

awk '$7 ~ /^[[:digit:]]+$/ && $1 != "Average:" { max[$7]="" } END { PROCINFO["sorted_in"]="@ind_num_asc";for (i in max) { maxtot=i } print maxtot }' file

使用GNU awk,搜索字段7仅为数字而字段1不是“平均值”的行:在这些情况下,创建一个以字段7为索引的数组条目。最后,按索引升序对数组进行排序。循环设置maxtot变量的数组。max数组中的最后一个条目将是缓存的最高kbtot,因此print maxtot

tail-n+7
跳过前6行。这是故意的吗?在这里,我尝试了-n+7以避免有字母字符和空行的行。@ruudhelderman如果我将您的命令的一部分和一部分组合在一起,我似乎得到了您所要求的:
head-n-1测试文件| tail-n+7 | awk'BEGIN{a=0}{if($7>0+a)a=$7}END{print a}“
Output:
27555948
Yes我在找kbcached@RavinderSingh13@learnnewinfy,您确定可以检查我的两个解决方案并让我知道这是否对您有帮助?@learnnewinfy,如果您想跳过前6行,请尝试解决方案中提到的
tail-n+7 Input_file | awk…程序。但是我保留了一个条件来跳过中间有字符串的行,比如
kbmemfree
来跳过那些行。顺便说一句,是的。你的解决方案符合我的预期@胡言乱语13
awk '
/kbmemfree/{
  next
}
{
  if($2!~/^[AP]M$/){
    val=$6
  }
  else{
    val=$7
  }
}
{
  max=(max>val?max:val)
  val=""
}
END{
  print "Maximum value is:" max
}
'  Input_file
awk '$7 ~ ^[[:digit:]]+$/ && $1 != "Average:" { 
                      max[$7]="" 
              } 
     END      { 
                      PROCINFO["sorted_in"]="@ind_num_asc";
                      for (i in max) { 
                                       maxtot=i 
                                     } 
                      print maxtot 
               }' file    
awk '$7 ~ /^[[:digit:]]+$/ && $1 != "Average:" { max[$7]="" } END { PROCINFO["sorted_in"]="@ind_num_asc";for (i in max) { maxtot=i } print maxtot }' file