Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
使用linux查找数据文件中两个字符串之间的最小值和最大值_Linux_String_Max_Minimum - Fatal编程技术网

使用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