在 UNIX 外壳脚本中比较两个文件中的行,并在没有冗余数据的情况下进行合并



驱动器上驻留了一个旧报告文件。每次生成新报告时,都应将其与此旧文件的内容进行比较。如果此新报告文件中报告了任何新帐户行,则应将其添加到旧文件中,否则只需跳过即可。两个文件将具有相同的标题和标题。例如:旧报告

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 文件的全部内容放在一起。 在此之后,您可以执行常规文件清理,例如删除您创建的任何新文件。要保留/调试任何更改,您可以为每个"唯一"文件名添加日期戳,并将其保留为所有报告添加的审计跟踪。

相关内容

  • 没有找到相关文章

最新更新