awk脚本删除单个记录,而不只是组记录
我有一个输出条目从$ NEWFILE缺席,但在$的oldfile发现了一个awk命令:awk脚本删除单个记录,而不只是组记录
awk -F "|" 'NR==FNR{a[$4]++}!a[$4]' $NEWFILE $OLDFILE > $OUTFILE
此命令的伟大工程,当实体的所有条目在$ NEWFILE中找不到共享唯一标识符。但是,如果实体中只有一个条目(而不是全部)已从$ NEWFILE中删除,则它会失败。
任何人都有关于如何调整awk命令来输出$ NEWFILE中没有但在$ OLDFILE中找到的所有条目的建议,无论是否删除实体的所有条目?
如果我理解正确的话,这是你要
awk -F "|" 'NR==FNR{a[$1 $2 $3 $4]++}!a[$1 $2 $3 $4]' NEWFILE OLDFILE > OUTFILE
由于NEWFILE
没有出现在OLDFILE
唯一行标识符是四个第一场的复合材料中的网址是什么。因为NEWFILE
没有这些网址,所以简单的diff
不会。
就是这样!我认为它可能缩短为:'awk -F“|” 'NR == FNR {a [$ 2 $ 4] ++}![$ 2 $ 4]'NEWFILE OLDFILE> OUTFILE'但是是的,就是这样!谢谢! – user981023
@ user981023:可能是这样。不确定对有限的示例数据存在的其余数据集做出哪些假设。如果它解决了您的问题,请随时接受答案。 – flesk
嗯,我在想,既然$ 1和$ 3的列总是匹配$ 4,那么$ 2就是唯一的条目。因此,如果$ 2和$ 4匹配,您可以放心地删除。那是对的吗? – user981023
AWK是行解释线那原因只有一个被删除线和其他地方之中。你可以做两件事:
- 如果可以的话,过滤一个表达式,该表达式对于行是通用的。
- 对于newfile的每一行,运行一个for循环,它将迭代oldfile并为您执行操作。
必须使用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列,像最基本的加入,你不希望再次重申,必须先进行排序。
根据您的数据,您是否需要关闭第四列或是否可以关闭第一列? – Xailor