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

答え2

条件を誤って理解しているようですawk。各行の始まりはい状態。ここにもう少し... awk-ward方法があります。

awk '
/LY1/ { 
        tag=gensub(/_.*/,"","1",gensub(/.*LY1/,"LY1","1", $NF))
        print tag
        next
}
{
    print
}' input.file

最初のもの/LY1/は暗黙のmatches条件です。つまり、入力行が正規表現と一致する場合にのみ式が実行されます。式は最初に行のすべての項目を、以下、および包含で置き換え、LY1それLY1を変数タグに入れます。その後、ラベルを印刷しますnext- ステートメントは他のすべての式をスキップします。この記録のために

次に、単に行をそのまま印刷する無条件式が続きます。ただし、前の式が実行されると呼び出されるため、実行されませんnext

答え3

この試み:

awk '
{
   if(!match($NF,"LY1[^_]*")){
     print
   }
   else {
     tag=substr($NF,RSTART,RLENGTH)
     print tag
   }
}' input.file

match()正規表現を見つけてください。

また、この関数は正規表現が始まり終わる位置を表すRSTART2つの特殊変数を設定します。RLENGTH

関連情報