Bashでネストされたループを使用してデータファイルからCSVファイルを埋める

Bashでネストされたループを使用してデータファイルからCSVファイルを埋める

最終レポートのために削除する必要がある4.txtファイルのフルパスと追加データ()を含むファイルがあります。*.cfg5.csv

例えば/source/EDDG/env1/dom1/proj/config/test.cfg

<ListVariable name="selected_lookups">          
 <CompoundVariableValue>
  <StringVariableValue name="lookup_name" value="CUSTOMER_1"/>
  <StringVariableValue name="business_name" value="DEVCUSTOMER"/>
  <StringVariableValue name="sample_data_path"value="/dev/.dat"/>
 </CompoundVariableValue>
 <CompoundVariableValue>
   <StringVariableValue name="lookup_name" value="CODE_1"/>
   <StringVariableValue name="business_name"value="CONCUSTOMER"/>
 </CompoundVariableValue>
</ListVariable>

(この手順は約238回繰り返され、との間のデータは<ListVariable * >異なります</ListVariable>

これで、このファイルから4つの値を取得してcsvファイルにパイプする必要があります。例:

DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s) (thr can be many per cfgfile) 
source, EDGE, test.cfg, CUSTOMER_1
                      , CONCUSTOMER  (second lookup name value)
... repeat for all cfg files in 4.txt

このデータを取得するには、最初の3列にはうまく機能しますが、4番目の列にはうまく機能しない次のループがあります。

for COL_VAL in `cat 4.txt | grep '/source/EDDG*'` ;
do
    DOM=`echo "${COL_VAL}" | awk -F'/' '{ print $7 }'`
    PROJ=`echo "${COL_VAL}" | awk -F'/' '{ print $8 }'`
    CGF=`echo "${COL_VAL}" | awk -F'/' '{ print $10 }'`
    LKP=`echo "${COL_VAL}" | grep 'name="lookup_name" value="' | awk -F'value="' '{ print $2 }' | awk -F'_1' '{ print $1 }'`

    echo "${DOM},${PROJ},${CFG},${LKP}"

   done < ${TMPDIR}/4.txt > ${TMPDIR}/5.csv

だから私は次のようなネストされたループを試しました。

for COL_VAL in `cat 4.txt | grep '/source/EDDG*'` ;
do
    DOMN=`echo ${COL_VAL} | awk -F'/' '{ print $7 }'`
    PROJ=`echo ${COL_VAL} | awk -F'/' '{ print $8 }'`
    APFG=`echo ${COL_VAL} | awk -F'/' '{ print $10 }'`

    for LOOK_UP in `cat 4.txt | grep 'name="lookup_name" value="'` ;
    do
        ULKP=`echo "${LOOK_UP}" |  awk -F'value="' '{ print $2 }' | awk -F'_1' '{ print $1 }'`
    done

    echo "${DOMN},${PROJ},${APFG},${ULKP}"

done < ${TMPDIR}/4.txt > ${TMPDIR}/5.csv

これにより、4番目の列が埋められますが、同じデータで埋められます。そして、奇妙なことは、4番目の列のデータが4.txtで最後に照会された絶対名の値である「'name = "lookup_name" value = XYZ」ということです。

例えば

DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s) 
source, EDGE, test.cfg, XYZ
      ,     ,         , XYZ
... repeat for all cfg files in 4.txt

ベストアンサー1

これはどうですか。単一の実行はawk元のスクリプトと比較してかなり高速です。

$ awk -F/ 'BEGIN{print "DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)"}/source\/EDDG/{a=$2", "$3", "substr($8,0,length($8)-2)", "}/lookup_name/{gsub(/^.*value="/,"");gsub(/".*/,"");print a$0}' 4.txt
DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)
source, EDDG, test.cfg, CUSTOMER_1
source, EDDG, test.cfg, CODE_1
$

または、よりきれいな形式を使用すると、次のようになります。

$ awk -F/ 'BEGIN {
            print "DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)"
           }
           /source\/EDDG/ {
            a=$2", "$3", "substr($8,0,length($8)-2)", "}
           /lookup_name/ {
            gsub(/^.*value="/,"")
            gsub(/".*/,"")
            print a$0
           }' 4.txt
DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)
source, EDDG, test.cfg, CUSTOMER_1
source, EDDG, test.cfg, CODE_1
$

おすすめ記事