Home > front end >  Want to add the headers in text file in shell script
Want to add the headers in text file in shell script

Time:11-10

I want to add the header at the start of the file for that I use the following code but it will not add the header can please help where i am doing wrong.

start_MERGE_JobRec()
{
   FindBatchNumber

   export TEMP_SP_FORMAT="Temp_${file_indicator}_SP_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_INSTANCE[0-9][0-9].txt"
   export TEMP_SS_FORMAT="Temp_${file_indicator}_SS_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_INSTANCE[0-9][0-9].txt"
   export TEMP_SG_FORMAT="Temp_${file_indicator}_SG_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_INSTANCE[0-9][0-9].txt"
   export TEMP_GS_FORMAT="Temp_${file_indicator}_GS_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_INSTANCE[0-9][0-9].txt"


   export SP_OUTPUT_FILE="RTBCON_${file_indicator}_SP_${ONLINE_DATE}${TIME}_${BATCH_NUMBER}.txt"
   export SS_OUTPUT_FILE="RTBCON_${file_indicator}_SS_${ONLINE_DATE}${TIME}_${BATCH_NUMBER}.txt"
   export SG_OUTPUT_FILE="RTBCON_${file_indicator}_SG_${ONLINE_DATE}${TIME}_${BATCH_NUMBER}.txt"
   export GS_OUTPUT_FILE="RTBCON_${file_indicator}_GS_${ONLINE_DATE}${TIME}_${BATCH_NUMBER}.txt"

  #---------------------------------------------------
  # Add header at the start for each file
  #---------------------------------------------------


  awk '{print "recordType|lifetimeId|MSISDN|status|effectiveDate|expiryDate|oldMSISDN|accountType|billingAccountNumber|usageTypeBen|IMEI|IMSI|cycleCode|cycleMonth|firstBillExperience|recordStatus|failureReason"$0}' >> $SP_OUTPUT_FILE

  find . -maxdepth 1 -type f -name "${TEMP_SP_FORMAT}" -exec cat {}   >> $SP_OUTPUT_FILE
  find . -maxdepth 1 -type f -name "${TEMP_SS_FORMAT}" -exec cat {}   >> $SS_OUTPUT_FILE
  find . -maxdepth 1 -type f -name "${TEMP_SG_FORMAT}" -exec cat {}   >> $SG_OUTPUT_FILE
  find . -maxdepth 1 -type f -name "${TEMP_GS_FORMAT}" -exec cat {}   >> $GS_OUTPUT_FILE
}

I use awk to add the header but it's not working.

CodePudding user response:

Awk requires an input file before it will print anything.

A common way to force Awk to print something even when there is no input is to put the print statement in a BEGIN block;

awk 'BEGIN { print "something" }' /dev/null

but if you want to prepend a header to all the output files, I don't see why you are using Awk here at all, let alone printing the header in front of every output line. Are you looking for this, instead?

echo 'recordType|lifetimeId|MSISDN|status|effectiveDate|expiryDate|oldMSISDN|accountType|billingAccountNumber|usageTypeBen|IMEI|IMSI|cycleCode|cycleMonth|firstBillExperience|recordStatus|failureReason' |
tee  "$SS_OUTPUT_FILE" "$SG_OUTPUT_FILE" "$GS_OUTPUT_FILE" >"$SP_OUTPUT_FILE"

Notice also how we generally always quote shell variables unless we specifically want the shell to perform word splitting and wildcard expansion on their values, and avoid upper case for private variables.

There also does not seem to be any reason to export your variables -- neither Awk nor find pays any attention to them, and there are no other processes here. The purpose of export is to make a variable visible to the environment of subprocesses. You might want to declare them as local, though.

Perhaps break out a second function to avoid all this code repetition, anyway?

merge_individual_job() {
    echo 'recordType|lifetimeId|MSISDN|status|effectiveDate|expiryDate|oldMSISDN|accountType|billingAccountNumber|usageTypeBen|IMEI|IMSI|cycleCode|cycleMonth|firstBillExperience|recordStatus|failureReason'
    find . -maxdepth 1 -type f -name "$1" -exec cat {}  
}

start_MERGE_JobRec()
{
    FindBatchNumber
    local id
    for id in SP SS SG GS; do
        merge_individual_job \
            "Temp_${file_indicator}_${id}_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_INSTANCE[0-9][0-9].txt" \
>"RTBCON_${file_indicator}_${id}_${ONLINE_DATE}${TIME}_${BATCH_NUMBER}.txt"
    done
}

If FindBatchNumber sets the variable file_indicator, a more idiomatic and less error-prone approach is to have it just echo it, and have the caller assign it:

    file_indicator=$(FindBatchNumber)
  • Related