在处理人口统计信息时,经常需要更新包含大量行数据的基线文件。每行代表一个人的人口统计信息。接着,一个cronjob服务会创建一个包含更新信息或新增人员的临时CSV文件。服务将处理这个新的临时文件,并更新基线文件以包含任何更改的数据或新增人员,同时也会删除基线文件中的任何人员。本文将介绍如何使用diff命令的-e选项生成GNU ed编辑器脚本,并结合ed和其他命令来正确创建新的基线文件。
脚本在bash shell中运行,创建了变量来引用基线文件和临时文件:
#!/bin/bash
NOW=$(date +"%Y%m%d%H%M")
# Timestamp for creating files.
BASELINE=`ls baseline/baseline.csv`
TEMP=`ls temp/compare.csv`
在上面的脚本中,变量$NOW用于文件的时间戳。时间戳的格式是“yyyymmddhhmm”。这在想要跟踪文件创建时间时非常有用。变量$baseline是基线文件,$TEMP是临时文件。
以下行使用diff命令的-e选项创建ed编辑器脚本:
diff -e $BASELINE $TEMP > ed-script
文件“ed-script”基本上是一个ed编辑器脚本。
然后,要使用ed脚本创建新的基线,需要运行以下命令:
cp $BASELINE baseline/new_baseline.csv
(cat ed-script && echo w) | ed - baseline/new_baseline.csv
已经展示了两行命令,一行是首先创建原始基线的副本,以免覆盖原始基线;然后第二行,创建新的基线。脚本中的(cat ed-script && echo w)部分,基本上是将ed-script输出到标准输出,然后发出w命令来写入文件;这一切都被管道传输到ed和新的基线文件中以生成。
备份(或归档)是个好主意,以防万一出错:
mv $BASELINE archive/baseline_$NOW.csv
mv baseline/new_baseline.csv $BASELINE
上述操作将原始基线移动到归档文件夹,并在文件名中附加时间戳。然后第二个移动(mv)操作,将文件重命名为baseline.csv,这完成了新基线的创建。
#!/bin/bash
NOW=$(date +"%Y%m%d%H%M")
# Timestamp for creating files.
BASELINE=`ls baseline/baseline.csv`
TEMP=`ls temp/compare.csv`
diff -e $BASELINE $TEMP > ed-script
cp $BASELINE baseline/new_baseline.csv
(cat ed-script && echo w) | ed - baseline/new_baseline.csv
mv $BASELINE archive/baseline_$NOW.csv
mv baseline/new_baseline.csv $BASELINE