驱动器上驻留了一个旧报告文件。每次生成新报告时,都应将其与此旧文件的内容进行比较。如果此新报告文件中报告了任何新帐户行,则应将其添加到旧文件中,否则只需跳过即可。两个文件将具有相同的标题和标题。例如:旧报告
RUN DATE:xyz FEE ASSESSMENT REPORT
fee calculator
ACCOUNT NUMBER DELVRY DT TOTAL FEES
=======================================================
123456 2014-06-27 110.0
新报告可能是
RUN DATE:xyz FEE ASSESSMENT REPORT
fee calculator
ACCOUNT NUMBER DELVRY DT TOTAL FEES
=======================================================
898989 2014-06-26 11.0
因此,现在应该合并旧报告以在其下包含两行 - 123456 并且898989没有行。
我是 shell 脚本的新手。我不知道我应该使用 diff cmd 还是在阅读 LINE 或 awk 时?
谢谢!
这似乎是几个命令的组合来创建实际的脚本,而不是仅在一行中熟练的命令行。
假设报表标题部分中的行数一致,则可以使用 tail -n +7
返回前 7 行之后的行数,如示例中所示。
如果它们不相同,但都以您在上面显示的"==========
"行结尾,那么您可以使用grep -n
查找该行号并开始解析其后的帐号。
#!/usr/bin/env bash
OLD_FILE="ancient_report.log"
NEW_FILE="latest_and_greatest.log"
tmp_ext=".tmp"
tail -n +7 ${OLD_FILE} > ${OLD_FILE}${tmp_ext}
tail -n +7 ${NEW_FILE} >> ${OLD_FILE}${tmp_ext}
sort -u ${OLD_FILE}${tmp_ext} > ${OLD_FILE}${tmp_ext}.unique
mv -f ${OLD_FILE}${tmp_ext}.unique ${OLD_FILE}
为了说明此脚本,请执行以下操作:
#!/usr/bin/env bash
上面的 shebang 行告诉 *nix 如何运行它。
OLD_FILE="ancient_report.log"
NEW_FILE="latest_and_greatest.log"
tmp_ext=".tmp"
声明起始变量。 您也可以通过使用文件名的参数来执行此操作。 OLD_FILE=${1}
在命令行上获取第一个参数。
tail -n +7 ${OLD_FILE} > ${OLD_FILE}${tmp_ext}
tail -n +7 ${NEW_FILE} >> ${OLD_FILE}${tmp_ext}
将两个文件的结尾放入单个"tmp"文件中
sort -u ${OLD_FILE}${tmp_ext} > ${OLD_FILE}${tmp_ext}.unique
仅对具有-u
的"唯一"条目进行排序和保留如果您的操作系统版本sort
没有-u
则您可以使用以下方法获得相同的结果: sort <filename> | uniq
mv -f ${OLD_FILE}${tmp_ext}.unique ${OLD_FILE}
用新的 uniq'd 文件替换旧文件。
当然,有许多更简单的方法可以做到这一点,但是这个方法可以通过一个顺序中的几个命令来完成工作。
编辑:
要使用最新的报告日期保留文件的标头部分,则不要mv
旧的 tmp 文件,而是执行以下操作:
rm ${OLD_FILE};
head -n 7 ${NEW_FILE}) > ${OLD_FILE}
cat ${OLD_FILE}${tmp_ext}.unique >> ${OLD_FILE}
这将删除OLD_FILE(如果不先删除就无法覆盖(,并将新文件的标头(日期(和唯一 tmp 文件的全部内容放在一起。 在此之后,您可以执行常规文件清理,例如删除您创建的任何新文件。要保留/调试任何更改,您可以为每个"唯一"文件名添加日期戳,并将其保留为所有报告添加的审计跟踪。