我有一个awk命令,输出$ NEWFILE中缺少的条目但在$ OLDFILE中找到:
awk -F "|" 'NR==FNR{a[$4]++}!a[$4]' $NEWFILE $OLDFILE > $OUTFILE
当在$ NEWFILE中找不到共享唯一标识符的实体的所有条目时,此命令很有用。但是,当实体中只有一个条目(但不是全部条目)已从$ NEWFILE中删除时,它会失败。
有人建议如何调整这个awk命令来输出$ NEWFILE中缺少但在$ OLDFILE中找不到的所有条目,无论是否删除了实体的所有条目?
答案 0 :(得分:2)
简短而甜蜜:使用diff
。您可以diff oldfile newfile | grep '^< ' | cut -b3-
将输出限制为您想要的输出。
答案 1 :(得分:0)
AWK是一个逐行解释器,这是因为只有一行被删除而另一行被删除。你可以做两件事:
答案 2 :(得分:0)
如果我理解正确,这就是你想要的
awk -F "|" 'NR==FNR{a[$1 $2 $3 $4]++}!a[$1 $2 $3 $4]' NEWFILE OLDFILE > OUTFILE
由于NEWFILE
没有OLDFILE
中的网址,因此唯一行标识符是四个第一个字段的合成。由于NEWFILE
没有这些网址,因此简单的diff
不会。
答案 3 :(得分:0)
您必须使用awk
吗?我们可以简单地使用join
,这就是你在这里做的,不是吗?
$join -v2 -t'|' -j4 <(sort -t'|' -k4 newfile) <(sort -t'|' -k4 oldfile ) |tee outfile
P-1-01541|22|Professor|University of Alabama at Birmingham|http://www.uab.edu/
P-1-01541|22|Short-Term Scholar|University of Alabama at Birmingham|http://www.uab.edu/
这当然假设您正在加入第4列,并且像您不想重新迭代的大多数基本联接一样,它必须先排序。