【发布时间】:2015-07-13 21:04:18
【问题描述】:
*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。
【问题讨论】:
-
你怎么看,如果我首先找到第一个字符串所在的 NR,然后找到第二个字符串所在的 NR,然后遵循相同的代码?您能否建议找到存在特定字符串的 NR?我有一个这样做的想法,可能是新手,但我认为它肯定会奏效。
-
你也可以这样做,但它需要两次遍历文件。如果它不是一个大文件,做任何感觉最舒服的事情。或者你可以把它分成两个脚本;一个只打印所需的区域,另一个做你现在正在做的事情。提示:
sed -n '/^\*ELEMENT_SHELL_THICKNESS$/,/^\*End$/p' your_file | awk ...但是做状态变量的事情也不难。 (将我的评论移到答案中,并提供了实现它的代码。)