【发布时间】:2013-09-13 22:39:13
【问题描述】:
我有三个文件,我想使用 awk 比较前两个文件,然后用第一个文件中不匹配的名称更新最后一个文件。
文件 1:ignore.txt
bob
diana
文件 2:list.txt
alice
bob
chris
diana
elvis
文件 3:names.txt
alice
chris
elvis
文件 2 每隔一段时间就会添加新名称,因此我必须能够将它与其他两个文件进行比较,并将该列表中的任何新名称添加到 names.txt。
到目前为止,这是我的脚本,比较 List 和 ignore 是有效的,但它没有进行更新,因为我仍然不明白如何正确使用 getline 并将新数组与内存中的文件进行比较。
我正在调用这样的脚本:awk -f compare ignore.txt list.txt,它可以工作。如果我用额外的变量调用它,它不会这样做:awk -f compare -v newnames=1 ignore.txt list.txt。
BEGIN {
file="list.txt"
tmpfile="new_list.txt"
}
# working
FNR == NR { names[$0]++; next }
!names[$0] {
print > names.txt
}
{ #not working
if (newnames == 1) {
mvcmd="mv " tmpfile file;
while ((getline newnames < file) > 0)
newnames[$0]++; next
!newnames[$0];
print > tmpfile
system(mvcmd)
close(dbfile)
}
我怎样才能让它工作?代码不是很好,因为我觉得它令人困惑。对不起。
【问题讨论】:
-
如果顺序不重要,您可以完全忽略
file3的内容。 -
使用 getline 的正当理由很少。如果您正在考虑使用它,请确保您阅读并完全理解 awk.info/?tip/getline 中描述的所有陷阱。