AWKから特定の行と列の値を取得する必要があります。

AWKから特定の行と列の値を取得する必要があります。

その下の値を求めれば良いのですWOXが、この場合は 4 と同じです。

IOT  CND  FO    WZX  END
0         0     0    0
WOX  SR  POW   LIO LIO2
4    00  0
FDR   OTY  M
0

以下のコードを試しましたが、これ以上進めません。

WOXpos=index(DATA,"WOX") 
BR=trim(substr(DATA,WOXpos,3))

私が得た結果は次のとおりです。

IOT
0
WOX
4
FDR
0

答え1

編集する:

コメントで述べたように、キーはWOX最初の列にのみ必要です。このスクリプトは、フィールドが 1 つ以上のスペースまたはタブで区切られていると仮定し、前のスペースまたはタブを無視します。

awk -v key=WOX 'found { print $1; found=0 }
    $1 == key { found=1 }' inputfile

印刷

4

説明する:

awkフィールド番号/列は1から始まります。 ($0全体の行を表します。)

  • -v key=WOX=変数設定
  • found { print $1; found=0 }=キーが前の行で見つかった場合は、最初の列の値を印刷してフラグをクリアします。
  • $1 == key { found=1 }= 最初のフィールドを比較し、一致するものがあればフラグを設定します。

キーがWOX複数行に表示されると、スクリプトはすべての項目の下に1行に1つずつ値を印刷します。


以前の提案

awk -v key=WOX 'col { print $col; col=0 }
    { for(i=1; !col && (i<=NF); i++) if($i == key) col=i }' inputfile

説明する:

awkフィールド番号/列は1から始まります。 ($0全体の行を表します。)

  • -v key=WOX=変数設定
  • col { print $col; col=0 }= 列がゼロでない場合は、列の値を印刷して列を消去します。
  • { for(i=1; !col && (i<=NF); i++) if($i == key) col=i }= は、ループのキーに一致する最初のフィールドを検索し、列番号を保存します。

WOX何度も現れる場合同じ行に、最初の値より下の値を印刷します。

スクリプトは質問に表示された入力とキーに対して機能しますが、キーまたは値フィールドの前にNULL値があると問題が発生します。

関連情報