2011-12-02 78 views
1

我有一个输出条目从$ NEWFILE缺席,但在$的oldfile发现了一个awk命令:awk脚本删除单个记录,而不只是组记录

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

此命令的伟大工程,当实体的所有条目在$ NEWFILE中找不到共享唯一标识符。但是,如果实体中只有一个条目(而不是全部)已从$ NEWFILE中删除,则它会失败。

任何人都有关于如何调整awk命令来输出$ NEWFILE中没有但在$ OLDFILE中找到的所有条目的建议,无论是否删除实体的所有条目?

样本数据:newfileoldfile

+0

根据您的数据,您是否需要关闭第四列或是否可以关闭第一列? – Xailor

回答

0

如果我理解正确的话,这是你要

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

由于NEWFILE没有出现在OLDFILE唯一行标识符是四个第一场的复合材料中的网址是什么。因为NEWFILE没有这些网址,所以简单的diff不会。

+0

就是这样!我认为它可能缩短为:'awk -F“|” 'NR == FNR {a [$ 2 $ 4] ++}![$ 2 $ 4]'NEWFILE OLDFILE> OUTFILE'但是是的,就是这样!谢谢! – user981023

+0

@ user981023:可能是这样。不确定对有限的示例数据存在的其余数据集做出哪些假设。如果它解决了您的问题,请随时接受答案。 – flesk

+0

嗯,我在想,既然$ 1和$ 3的列总是匹配$ 4,那么$ 2就是唯一的条目。因此,如果$ 2和$ 4匹配,您可以放心地删除。那是对的吗? – user981023

0

AWK是行解释线那原因只有一个被删除线和其他地方之中。你可以做两件事:

  • 如果可以的话,过滤一个表达式,该表达式对于行是通用的。
  • 对于newfile的每一行,运行一个for循环,它将迭代oldfile并为您执行操作。
2

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

+0

'diff'不适用于他的情况,因为'OLDFILE'对于'NEWFILE'没有的每一行都有一个url字段。你的简短而甜蜜的命令相当于'cat newfile'。 – flesk

+0

是的,差异很好。 – Xailor

+0

所以我们可能想先删除它,按照'sed oldfile -e's/| [^ |] * $ //'| diff - newfile | grep'^ <'| cut -b3 -' –

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列,像最基本的加入,你不希望再次重申,必须先进行排序。