使用linux在数据文件中查找两个字符串之间的最小值和最大值

时间:2012-02-17 08:24:22

标签: linux string max minimum

*KEYWORD
$TIME_VALUE = 1.4000002e+001
$STATE_NO = 15
$Output for State 15 at time = 14
*ELEMENT_SHELL_THICKNESS
1346995      25 1457683 1471891 1457727 1471929
9.953265e-001   9.953265e-001   9.953265e-001   9.953265e-001
1346996      25 1471891 1457685 1471930 1457727  
9.953963e-001   9.953963e-001   9.953963e-001   9.953963e-001
1346997      25 1457685 1471892 1471931 1471930
9.953437e-001   9.953437e-001   9.953437e-001   9.953437e-001
*End

所以输出可能是

min=9.953265e-001  on line  07   at  1346995
max=9.953963e-001  on line  09   at  1346996

一个可能的解决方案,如果我们知道行号是

cat your_file | awk '
NR >= 6 && NR <= 11{at=$1;getline
if (max < $1){max=$1;max_line=NR;max_at=at}
if (min > $1){min=$1;min_line=NR;min_at=at}}
NR == 7{min=$1;min_line=NR;min_at=at}
END{
printf "min=%-13e on line  %02d at %8d\n", min, min_line, min_at
printf "max=%-13e on line  %02d at %8d\n", max, max_line, max_at}'

但是如果我想在* Keyword和* End之间进行搜索怎么办,因为由于文件中的小编辑,字符串到达​​定义的行并且其值为0,因此最小值设置为零。

任何建议。

我必须提一下,jfgagne在上一个问题min and max in certain lines of input file with the tag of line number中提供了这个好的解决方案。

1 个答案:

答案 0 :(得分:2)

在脚本中添加状态。如果你的状态变量是假的;如果你正在查看开始标记,则将其设置为true;无论如何,跳到下一行。如果你的状态变量是真的;如果查看结束标记,请将状态变量设置为false,然后跳到下一行;否则,你在该地区;像以前一样处理这条线。

awk '!there{if($1 == "*ELEMENT_SHELL_THICKNESS") there=1; next}
there&&/^\*End$/{there=0;next}
{at=$1;getline
  if (!max || max < $1){max=$1;max_line=NR;max_at=at}
  if (!min || min > $1){min=$1;min_line=NR;min_at=at}}
END{
  printf "min=%-13e on line  %02d at %8d\n", min, min_line, min_at
  printf "max=%-13e on line  %02d at %8d\n", max, max_line, max_at}' your_file

我认为代码建议的开始标记为*ELEMENT_SHELL_THICKNESS,而不是您在问题中所说的*KEYWORD。我删除了minmax初始化代码,主要是因为懒惰;如果其中任何一个可以为零,也许你应该把它放回去。

这也消除了无用的猫。 http://porkmail.org/era/unix/award.html