awkで変数を定義する

awkで変数を定義する

入力ファイルがあります。

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

おすすめ記事