繁体   English   中英

比较同一文件中的多列

[英]Comparing multiple columns within same file

我必须比较两列col1和col2,这样,如果A与B一起出现,并且再次出现与B紧随其后的A,那么后面的所有列应该只打印一对

Input file:
A   B   13.2    0.24    posx    209 215 posy    145 155
B   A   13.2    0.24    posy    145 155 posx    209 215
A   D   19.4    0.28    posx    209 215 posz    366 368


Required output:
A   B   13.2    0.24    posx    209 215 posy    145 155
A   D   19.4    0.28    posx    209 215 posz    366 368

输入文件非常大(〜10gb)。

这是使用awk一种方法:

awk '!(a[$1,$2]++ || a[$2,$1]++)' file
A   B   13.2    0.24    posx    209 215 posy    145 155
A   D   19.4    0.28    posx    209 215 posz    366 368

我们通过将它们用作数组a键来跟踪第1列和第2列。 ++会在遇到按键时增加它们的值。 || 是一个短路运算符,如果第一个条件为假,则仅会为第二个条件触发。

我们使用!取反条件输出! 由于awk默认行为是在真相上打印行,因此我们可以使用它来避免显式print语句。

它从每一行中获取前两个值,并形成用于过滤掉重复项的排序键,

perl -ane '@k = sort @F[0,1]; $s{"@k"}++ or print' file

输出

A   B   13.2    0.24    posx    209 215 posy    145 155
A   D   19.4    0.28    posx    209 215 posz    366 368
$ awk '!a[$1,$2];{a[$2,$1]++}' file      
A   B   13.2    0.24    posx    209 215 posy    145 155
A   D   19.4    0.28    posx    209 215 posz    366 368

通常情况下a将被命名seen ,但我部分地打高尔夫球与@ jaypal的回答所以需要让我的行程下来:-)。

两个答案之间的重要区别在于,他们如何对待以与上一行相同的两个键值开头的第二行。 jaypals答案不包括以任何顺序匹配先前看到的$ 1和$ 2的行,因此它将删除重复项,而我严格遵守发布的问题,并且仅删除先前看到反向键的后续行(即当前$ 1 $ 2 =先前$ 2 $ 1 )。

为了增强上述效果,将重复项排除在外(替代):

$ awk '!a[$1,$2]++;{a[$2,$1]++}' file

可能输入中永远不会有重复,因此这两种方式都可能无关紧要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM