0

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

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?

谢谢!

4

1 回答 1

2

这似乎是几个命令的组合来创建一个实际的脚本,而不是一个熟练的commandlinefu只在一行中。

假设报告标题部分中的行数是一致的,那么您可以使用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 文件的全部内容放在一起。在此之后,您可以进行常规文件清理,例如删除您创建的任何新文件。要保留/调试任何更改,您可以为每个“唯一”文件名添加一个日期戳,并将它们作为所有报告添加的审计跟踪。

于 2015-06-02T20:35:55.550 回答