入力ファイルがあります。
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()
正規表現を見つけてください。
また、この関数は正規表現が始まり終わる位置を表すRSTART
2つの特殊変数を設定します。RLENGTH