使用linux查找数据文件中两个字符串之间的最小值和最大值
因此,产量可能会下降使用linux查找数据文件中两个字符串之间的最小值和最大值,linux,string,max,minimum,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 1
*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您的|u文件| awk'
NR>=6&&NR$1){min=$1;min\u line=NR;min\u at=at}
NR==7{min=$1;min_line=NR;min_at=at}
结束{
printf“第%02d行%8d\n处的最小值=%-13e”,最小值,最小值,最小值
printf“max=%-13e在第%02d行的%8d\n处”,max,max\u行,max\u在}”
但是如果我想在*Keyword和*End之间搜索,因为在文件中进行了一个小的编辑,字符串到达定义的行,其值为0,所以最小值设置为0
任何建议
我必须提到,这个很好的解决方案是由在我前面的问题中提供的:。向脚本添加状态。如果您的状态变量为false;如果正在查看开始标记,则将其设置为true;无论如何,请跳到下一行。如果您的状态变量为true;如果查看结束标记,请将状态变量设置为false,并跳到下一行;否则,你就在该地区;如前所述处理生产线
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}'
awk'!那里{if($1==“*元素\外壳\厚度”)那里=1;下一个}
there&&/^\*End$/{there=0;next}
{at=$1;getline
如果(!max | | max<$1){max=$1;max_line=NR;max_at=at}
如果(!min | | min>$1){min=$1;min_line=NR;min_at=at}
结束{
printf“第%02d行%8d\n处的最小值=%-13e”,最小值,最小值,最小值
printf“max=%-13e在第%02d行的%8d\n处”,max,max\u行,max\u在}您的\u文件
我假设起始标记是代码建议的*元素\外壳\厚度
,而不是您在问题中所说的*关键字
。我删除了min
和max
初始化代码,主要是出于懒惰;如果其中一个可以是零,也许你应该把它放回去
这也消除了猫的无用用途 如果我首先找到第一个字符串所在的NR,然后找到第二个字符串所在的NR,然后找到相同的代码,你会怎么想?您能建议查找存在特定字符串的NR吗?我有一个这样做的想法,可能是新手,但我认为它肯定会工作。你也可以这样做,但它需要两次通过文件。如果不是一个大文件,做任何感觉最舒服的事情。或者你可以把它分成两个脚本;一个只打印所需区域,另一个执行您现在正在执行的操作。提示:
sed-n'/^\*ELEMENT\u SHELL\u THICKNESS$/,/^\*End$/p'您的文件| awk…
但执行状态变量也不难。(将我的评论移到了答案中,并提供了实现它的代码。)
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