awk脚本删除单个记录,而不仅仅是记录组

时间:2011-12-02 17:30:04

标签: bash shell awk

我有一个awk命令,输出$ NEWFILE中缺少的条目但在$ OLDFILE中找到:

awk -F "|" 'NR==FNR{a[$4]++}!a[$4]' $NEWFILE $OLDFILE > $OUTFILE

当在$ NEWFILE中找不到共享唯一标识符的实体的所有条目时,此命令很有用。但是,当实体中只有一个条目(但不是全部条目)已从$ NEWFILE中删除时,它会失败。

有人建议如何调整这个awk命令来输出$ NEWFILE中缺少但在$ OLDFILE中找不到的所有条目,无论是否删除了实体的所有条目?

示例数据:newfileoldfile

4 个答案:

答案 0 :(得分:2)

简短而甜蜜:使用diff。您可以diff oldfile newfile | grep '^< ' | cut -b3-将输出限制为您想要的输出。

答案 1 :(得分:0)

AWK是一个逐行解释器,这是因为只有一行被删除而另一行被删除。你可以做两件事:

  • 如果可以,请使用与行相同的表达式进行过滤。
  • 对于newfile的每一行,运行一个for循环,它将迭代oldfile并为你做操作。

答案 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列,并且像您不想重新迭代的大多数基本联接一样,它必须先排序。