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 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によって提供されたことに言及する必要があります。行番号のタグが付いた入力ファイルの特定の行の最小値と最大値です。

4

1 に答える 1

2

スクリプトに状態を追加します。状態変数が false の場合。開始マーカーを見ている場合は true に設定します。いずれにせよ、次の行にスキップしてください。状態変数が 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

于 2012-02-17T09:17:48.247 に答える