想要在 shell 脚本中的文本文件中添加 headers

Want to add the headers in text file in shell script

我想在文件的开头添加 header 因为我使用以下代码但它不会添加 header 可以请帮助我在哪里做错了。

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"[=12=]}' >> $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
}

我使用 awk 添加 header 但它不起作用。

Awk 在打印任何内容之前需要一个输入文件。

强制 Awk 在没有输入的情况下打印某些内容的常用方法是将 print 语句放在 BEGIN 块中;

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

但是如果你想在所有输出文件前加上一个 header,我根本不明白你为什么要在这里使用 Awk,更不用说在每个文件前面打印 header输出线。您是在找这个吗?

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"

还要注意我们通常总是如何 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.

似乎也没有任何理由 export 你的变量——Awk 和 find 都没有注意它们,这里也没有其他进程。 export 的目的是使变量对子进程的环境可见。不过,您可能希望将它们声明为 local

也许再开发一个函数来避免所有这些代码重复?

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 "" -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
}

如果 FindBatchNumber 设置变量 file_indicator,一个更惯用且更少 error-prone 的方法是让它 echo 它,并让调用者分配它:

    file_indicator=$(FindBatchNumber)