入力ファイルがあります。
3.59717487E+05 3.40210880E+06 4075.32 7066.00 4075.32 7066 4075.322 2 a_final_psdm_LY1-1250_20160307
3.59725248E+05 3.40211860E+06 4063.53 7067.00 4063.53 7067 4063.527 2 a_final_psdm_LY1-1250_20160307
3.59733009E+05 3.40212840E+06 4051.73 7068.00 4051.73 7068 4051.731 2 a_final_psdm_LY1-1250_20160307
3.59740771E+05 3.40213820E+06 4039.94 7069.00 4039.94 7069 4039.936 2 a_final_psdm_LY1-1250_20160307
最後の列を取得して変数(LY1-1250セクション)を定義する必要があります。これが私が今まで持っているものです:
awk '
BEGIN{
if($NF !~ /LY1/){
print
}
else{
tag=$NF
print tag
}
}
しかし、これは私にtag = a_final_psdm_LY1-1250_20160307を与えます。
タグ=LY1-1250が必要です。
シェルスクリプトで私はこれを行います
tag=`echo $NF sed... どうしたらいいの?
ところで、awkでは表現を評価しないようです。
ベストアンサー1
「ラベル」は最後から2番目の部分の後の部分なので、_
単にフィールド区切り文字として使用できます。
$ awk -F_ '{if($(NF-1)~/LY1/){print $(NF-1)}else{print}}' file
LY1-1250
LY1-1250
LY1-1250
LY1-1250
または変数として使用してください。
awk -F_ '{if($(NF-1)~/LY1/){tag=$(NF-1); print tag}else{print}}' file
あなたのコードがブロックにある理由を理解できませんBEGIN{}
。行を読み取る前に一度だけ実行されるため、定義されませんNF
。
とにかく一般的な場合、awkの変数に部分文字列を格納する方法は、またはsubstr
を使用することですsub
。したがって、次のようにすることもできます。
$ awk '{
if($NF~/LY1/){
tag=$NF;
sub(/.*LY1/,"LY1",tag);
sub(/_[^_]*$/,"",tag);
print tag
}
else{ print } }' file
LY1-1250
LY1-1250
LY1-1250
LY1-1250