2015-01-30 3 views
1

Используйте приведенный ниже код, но это занимает больше времени для чтения.Как добавить имя и значения каждого набора записей в несколько записей

while read TAG 
do 
    TAGNAME=$(echo $TAG | cut -d '>' -f1) 
    TAGVALUE=$(echo $TAG | cut -d '>' -f2) 
    if [ "$TAGNAME" = "START_OF_REC" ] 
    then 
     CNT_VAR=`expr $CNT_VAR + 1` 
     DERIVED_ID=${DATE_VAR}${CNT_VAR} 

     CUST_ID_VAR="NULL_CUST_ID" 
     OPPOR_ID_VAR="NULL_OPPOR_ID" 

    elif [ "$TAGNAME" = "bd-cust-id" ] 
    then 
     CUST_ID_VAR=$TAGVALUE 
     sed -i 's/NULL_CUST_ID/'$CUST_ID_VAR'/g' $FLAT_FILE 
     echo ${CUST_ID_VAR}${PIPE}${OPPOR_ID_VAR}${PIPE}${DERIVED_ID}${PIPE}${TAGNAME}${PIPE}${TAGVALUE} >> $FLAT_FILE 

    elif [ "$TAGNAME" = "mars-opportunity-id" ] 
    then 
     OPPOR_ID_VAR=$TAGVALUE 
     if [ "$OPPOR_ID_VAR" = "EMPTY_VAL" ] 
     then 
      sed -i 's/NULL_OPPOR_ID//g' $FLAT_FILE 
     else 
      sed -i 's/NULL_OPPOR_ID/'$OPPOR_ID_VAR'/g' $FLAT_FILE 
      echo ${CUST_ID_VAR}${PIPE}${OPPOR_ID_VAR}${PIPE}${DERIVED_ID}${PIPE}${TAGNAME}${PIPE}${TAGVALUE} >> $FLAT_FILE 
     fi 

    else 
     if [ "$OPPOR_ID_VAR" = "EMPTY_VAL" ] 
     then 
      echo ${CUST_ID_VAR}${PIPE}${PIPE}${DERIVED_ID}${PIPE}${TAGNAME}${PIPE}${TAGVALUE} >> $FLAT_FILE 
     else 
      echo ${CUST_ID_VAR}${PIPE}${OPPOR_ID_VAR}${PIPE}${DERIVED_ID}${PIPE}${TAGNAME}${PIPE}${TAGVALUE} >> $FLAT_FILE 
     fi 
    fi 
done < INPUT_FILE 

Я использую приведенный выше код для чтения 50K записей, как указано ниже 2 записей примеров, которые начинаются каждую запись с START_OF_REC.

Я написал сценарий, но его навсегда заработал 50K записей.

Я ищу сценарий bash, который работает быстрее.

input_file

START_OF_REC>START 
trigger>SalesLeadCreated 
message-sent-at-ts>2015-01-27T00:00.08 
bd-cust-id>
mars-opportunity-id>2-BFGCMQ5 
mars-activity-id>2-BFGCMPZ 
lead-type>AccountOpen 
media-ad-code>WWW 
lead-action-code>completed 
START_OF_REC>START 
trigger>SalesLeadCreated 
message-sent-at-ts>2015-01-27T00:00.10 
bd-cust-id>054671 
mars-opportunity-id>2-BFGC39C 
mars-activity-id>2-BFGC396 
lead-type>AccountOpen  
media-ad-code>WWW `enter code here` 
lead-action-code>saved  

Ожидаемое ВЫВОД

bd-cust-id|mars-opportunity-id|SQL_ID|Tag_name|Tag_Value  
|2-BFGCMQ5|1|trigger|SalesLeadCreated  
|2-BFGCMQ5|1|message-sent-at-ts|2015-01-27T00:00.08 
|2-BFGCMQ5|1|bd-cust-id|
|2-BFGCMQ5|1|mars-opportunity-id|2-BFGCMQ5 
|2-BFGCMQ5|1|mars-activity-id|2-BFGCMPZ  
|2-BFGCMQ5|1|lead-type|AccountOpen 
|2-BFGCMQ5|1|media-ad-code|WWW 
|2-BFGCMQ5|1|lead-action-code|completed 
054671|2-BFGC39C|2|trigger|SalesLeadCreated 
054671|2-BFGC39C|2|message-sent-at-ts|2015-01-27T00:00.10 
054671|2-BFGC39C|2|bd-cust-id|054671 
054671|2-BFGC39C|2|mars-opportunity-id|2-BFGC39C 
054671|2-BFGC39C|2|mars-activity-id|2-BFGC396 
054671|2-BFGC39C|2|lead-type|AccountOpen 
054671|2-BFGC39C|2|media-ad-code|WWW 
054671|2-BFGC39C|2|lead-action-code|completed 
+0

Зацикливание ввода по строкам с помощью bash выполняется медленно. Вам также будет лучше, если вы не запустили 'sed' над файлом N раз. Переписывание этого в 'awk' или' perl' или 'python' или' ruby', скорее всего, будет * значительно быстрее. –

ответ

2
awk -F ">" -v OFS="|" ' 
    BEGIN { print "bd-cust-id|mars-opportunity-id|SQL_ID|Tag_name|Tag_Value" } 
    function output() { 
     sqlid++ 
     custid = data["bd-cust-id"] 
     oppid = data["mars-opportunity-id"] 
     for (key in data) 
      print custid, oppid, sqlid, key, data[key] 
     delete data 
    } 
    $1 == "START_OF_REC" { if (NR > 1) output(); next } 
    { data[$1] = $2 } 
    END { output() } 
' INPUT_FILE 
bd-cust-id|mars-opportunity-id|SQL_ID|Tag_name|Tag_Value 
|2-BFGCMQ5|1|bd-cust-id|
|2-BFGCMQ5|1|trigger|SalesLeadCreated 
|2-BFGCMQ5|1|mars-activity-id|2-BFGCMPZ 
|2-BFGCMQ5|1|lead-action-code|completed 
|2-BFGCMQ5|1|lead-type|AccountOpen 
|2-BFGCMQ5|1|media-ad-code|WWW 
|2-BFGCMQ5|1|message-sent-at-ts|2015-01-27T00:00.08 
|2-BFGCMQ5|1|mars-opportunity-id|2-BFGCMQ5 
054671 |2-BFGC39C|2|bd-cust-id|054671 
054671 |2-BFGC39C|2|trigger|SalesLeadCreated 
054671 |2-BFGC39C|2|mars-activity-id|2-BFGC396 
054671 |2-BFGC39C|2|lead-action-code|saved  
054671 |2-BFGC39C|2|lead-type|AccountOpen  
054671 |2-BFGC39C|2|media-ad-code|WWW `enter code here` 
054671 |2-BFGC39C|2|message-sent-at-ts|2015-01-27T00:00.10 
054671 |2-BFGC39C|2|mars-opportunity-id|2-BFGC39C 

Пространства из-за конечные пробелы в входном файле.

Я предполагаю, что SQL_ID - это просто счетчик записей.

+0

Есть ли способ получить текстовый порядок, как во входном файле, например, триггер, а затем другие столбцы и т. – user3347931