首页 > 解决方案 > 想要在 shell 脚本的文本文件中添加标题

问题描述

我想在文件的开头添加标题,因为我使用以下代码,但它不会添加标题可以请帮助我做错了什么。

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
}

我使用 awk 添加标题,但它不起作用。

标签: shellunixsh

解决方案


awk 需要输入文件才能打印任何内容。

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

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

但是如果你想在所有输出文件前加上一个标题,我根本不明白你为什么在这里使用 Awk,更不用说在每个输出行前面打印标题了。你是在寻找这个,而不是?

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"

还要注意我们通常如何引用 shell 变量,除非我们特别希望 shell 对其值执行分词和通配符扩展,并避免私有变量大写。

您的变量似乎也没有任何原因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 "$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
}

如果FindBatchNumber设置变量file_indicator,则更惯用且不易出错的方法是仅使用echo它,并让调用者分配它:

    file_indicator=$(FindBatchNumber)

推荐阅读