[英]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.