2017-07-07 2 views
0

各ブロックは入力データで 'COL ID'で始まります。 「COL ID」とJOB_subidがある場合は印刷する必要があります。入力データに見られるように、 'COLID = 2'にはjob_subid(テーブル名の1 /左)がありますが、 'COLID = 3'または 'COLID = 4'にはありません。 COLID = 3/4の場合、job_subidを持たないため、 'no_data'を出力したいと思います。 このデータはどのように処理できますか?ブロック(awk)で文字列を扱う方法

AWK

/COL ID/  {JOBID=$4;} 

/^[0-9]/ { 
    JOB_SUBID=$1; 
    printf "%s#%s",JOBID,JOB_SUBID; 
    printf "\n"; 
} 

END { 

if (JOB_SUBID="") then 
    JOB_SUBID="no_data"; 
    printf "%s#%s",JOBID,JOB_SUBID; 
    printf "\n"; 
end if; 

} 

入力データ

COL ID : 2 
PID  : 26788 


ID  TABLE       
------ ------------------------------ 
1  "SCOTT"."PRINCE01"    


COL ID : 3 
PID  : 26788 


COL ID : 4 
PID  : 26788 

誤った結果

2#1 
4#no_data 

必要な結果

2#1 
3#no_data 
4#no_data 
+0

'場合は()目アン... if if'?あなたが考えている言語は分かりませんが、Arnold RobbinsのEffective Awk Programming、第4版からawkを学ぶことができます。組み込みの変数名との衝突を避けるため、大文字の変数名はすべて使用しないでください。 –

答えて

1

あなたは、単に

  • COL ID
  • NR>1としてレコードセパレータを設定し、

    $ awk -v RS='COL ID' 'NR>1{print $2"#"($10==""?"no data":$10)}' file 
    2#1 
    3#no data 
    4#no data 
    

    簡単な説明によってこれを行うことがあります。最初のレコードを省略

  • $10サブIDが存在を確認した場合、印刷「なしデータ "でない場合。
+1

あなたは、multi-char RSのためにgawk固有のことを言及する必要があります。 –

+1

思い出してくれてありがとう。 – CWLiu

1

同じスタイルをそのまま使用したい場合は、このステートメントを追加してください。

/^[^0-9]/ {JOB_SUBID = ""}ENDブロック

+0

ありがとうございました.. – Sigularity

+0

それは動作しません。 –

1

awkのソリューションを取り除く:

awk '/COL ID/{ 
     if(colid) { sid=(subid)? subid:"no_data"; print colid"#"sid; subid="" } colid=$4 
    } 
    /^[0-9]+/{ subid=$1 }END{ if(colid) print colid"#"sid }' inputfile 

出力:

2#1 
3#no_data 
4#no_data 
+0

Brilliant..Thanks – Sigularity

0
$ cat tst.awk 
/COL ID/ { prt(); jobId = $NF } 
/^[0-9]/ { subId = $1 } 
END { prt() } 
function prt() { if (NR>1) print jobId "#" subId; subId="no_data" } 

$ awk -f tst.awk file 
2#1 
3#no_data 
4#no_data 
関連する問題