shell - 想要在 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 添加标题,但它不起作用。
解决方案
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)
推荐阅读
- docker - BlackBox 测试/监控 Kubernetes 集群
- java - TomEE 中的 ManagedScheduledExecutorService
- c++ - 引用声明中的赋值语句的含义与它之后的含义是否不同?
- php - Guzzle返回流?
- python - 导入绘图功能时阻止 Tkinter 打开第二个窗口
- android - 仅在首次使用应用程序时打开 TapTarget
- python - 生成 5 个不重复整数的列表
- python - 如何从 Anaconda 5.2(使用 python 3.6.6)升级到 Anaconda 5.3(使用 python 3.7)
- typescript - 通过主要版本更新包依赖项是否需要包本身的主要版本提升?
- javascript - javascript 创建或设计单例类的好方法