ベストアンサー1
そしてawk
:
awk 'NR==1{for(i=1;i<NF;i++){if($i=="OS_NATIVE_NAME"){s=index($0,$i); l=index($0,$(i+1))-s}}}
$1=="disk_0"{print substr($0,s,l)}' file
NR==1
最初の行(ヘッダー行)の場合は、NR
現在処理中の行番号のawks内部変数です。for(i=1;i<NF;i++)
フィールドを繰り返します。NF
現在行のフィールド数を表す awks 内部変数です。$i=="OS_NATIVE_NAME"
なぜなら、各フィールドを繰り返して、フィールド値が次のようになっていることを確認するからです。OS_NATIVE_NAME
s=index(...)
フィールドが始まる場所を見つけて、後で使用できるように保存します。index()
別の文字列(ここでは行全体)内で文字列(ここでは$ i値OS_NATIVE_NAME
)が表示される位置を取得するawks文字列関数。$0
l=index(...)-s
フィールドの長さを取得し、後で使用するために保存します。前と同じ原理ですが、長さを得るにはs
フィールドから減算する必要があります。
$1=="disk_0"
DEVICE
disk_0
最初のフィールド(例)で検索したいものを見つけます。$1
最初のフィールドを表します。{print substr($0,s,l)}
最後に、各行を印刷すると、文字列はpositionから始まり、s
長さを持ちますl
。substr()
長さのある場所(行1の処理中に以前に抽出した2つの変数)から文字列(ここでは行全体$0
)を切り取るawks文字列関数。s
l
印刷(入力のフィールド位置に関係なく):
sda