特定のパターンを見つけた後、途中で1行をスキップしてデータファイルの値を印刷するにはどうすればよいですか?

特定のパターンを見つけた後、途中で1行をスキップしてデータファイルの値を印刷するにはどうすればよいですか?

というファイルがありますFile-1。パターンを一致させる必要がありDATA_POINTS、行をスキップしてから、次の行の6番目の列を印刷しようとします。

  • File-1例:
    here ! some other data exist but all of them are totally different from the below data!
    
    In simple words following data is completely unique.
    
    
    DATA_POINTS
    12
       0.0000000000     0.0000000000     0.0000000000  20   !  A
       0.5000000000     0.5000000000     0.0000000000  20   !  B
       0.7500000000     0.5000000000     0.2500000000  20   !  C
       0.7500000000     0.3750000000     0.3750000000  20   !  D
       0.0000000000     0.0000000000     0.0000000000  20   !  E
       0.5000000000     0.5000000000     0.5000000000  20   !  F
       0.6250000000     0.6250000000     0.2500000000  20   !  U
       0.7500000000     0.5000000000     0.2500000000  20   !  W
       0.5000000000     0.5000000000     0.5000000000  20   !  L
       0.7500000000     0.3750000000     0.3750000000  20   !  K
       0.6250000000     0.6250000000     0.2500000000  20   !  U
       0.5000000000     0.5000000000     0.0000000000  20   !  X
    
  • 希望の出力
    S1 = A
    S2 = B
    S3 = C
    S4 = D
    S5 = E
    S6 = F
    S7 = U
    S8 = W
    S9 = L
    S10= K
    S11= U
    S12= X
    

パターンはDATA_POINTSファイル内で繰り返されず、正確に一致する必要があります。

最近のソリューション

他のqsnからこのコマンドを受け取りました。列6が同じ行パターンにある場合に機能します。

awk '/DATA_POINTS/{i==0 ; i++; getline; print "S"i"=", $6}' File-1

ベストアンサー1

次のawkプログラムがこれを行う必要があります。

awk 'BEGIN{n=-1}
     n>0{printf "S%-*d=%s\n",w,++i,$6; if (i==n) {i=0;n=-1}}
     n==0{n=$1;w=length($1)}
     $0=="DATA_POINTS"{n=0}' file

これは次のことを行います。

  • 最初は、「データブロックの外側」を意味するn「ステータスフラグ」が初期化されます。-1
  • DATA_POINTS文字列のみで構成された行が見つかった場合は、「次の行にデータポイントの数が含まれます」という意味にn設定します。0
  • 0の場合、n行の内容はデータポイント数として解釈され、に保存されますn。数値の長さ(文字/数字)は、w後で出力形式を指定するために使用されるフィールドに保存されます。
  • nより大きい場合は、「0データ」ブロック内にあることを示し、count変数i(固定幅で書式設定wおよび出力例で左に調整)と同じにiなるまで、行の6番目のフィールドを使用して「キー」を印刷しますnnリセット-1

これは、ファイルの終わりにないデータの集まりを処理できるため、必要以上に強力です(単にファイルの最後まで読み込むのではなく、ヘッダーで指定されたデータ行の数を尊重します)。

ノート現在の検索方法はDATA_POINTS完全な文字列一致であり、これは実際の文字列に特殊文字を含めることができる場合に最も強力な方法です。部分文字列一致または正規表現一致が必要な場合は、次のようにします。

index($0,"DATA_POINTS") { ... }

または(あなたの例のように)

/DATA_POINTS/ { ... }

また、空白行の誤解を防ぐために、およびをn>0それぞれn==0に置き換えます。n>0&&NFn==0&&NF

おすすめ記事