【问题标题】:finding min and maximum between two strings in a data file using linux使用linux查找数据文件中两个字符串之间的最小值和最大值
【发布时间】: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 ... 但是做状态变量的事情也不难。 (将我的评论移到答案中,并提供了实现它的代码。)

标签: linux string max minimum


【解决方案1】:

为您的脚本添加一个状态。如果您的状态变量为假;如果您正在查看开始标记,请将其设置为 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初始化代码,主要是出于懒惰;如果其中一个可以为零,也许你应该把它放回去。

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

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2015-03-28
    • 2012-09-14
    • 1970-01-01
    • 2018-10-24
    • 2012-04-18
    相关资源
    最近更新 更多