awk打印行,其中5个字段中的任何一个的值不同,忽略丢失的数据

时间:2015-04-20 20:47:56

标签: awk

我试图弄清楚我的表格文件中5个字段(字段4-8)的值是否存在任何成对差异。缺失的数据由字符串“na”表示。我想在这些字段中打印具有多个值的任何行,忽略丢失的数据(例如,下面示例的第一行中的T和G),或者如果包含“na”,则打印两个以上的值。

以下是我正在使用的数据文件中的几行:

2       1150    T       na      na      na      T       G
2       1151    C       na      na      na      T       C
2       1156    A       na      na      na      A       T
2       10742   C       T       na      T       na      na
2       10769   G       A       na      A       na      na
2       10781   T       G       na      G       na      na
2       58959   C       na      na      G       G       na
2       66907   G       na      na      A       G       na
2       66911   A       na      na      T       A       na
2       73087   C       C       na      C       C       T
2       92844   G       na      na      na      T       T
2       92846   T       na      na      na      T       G
2       99932   G       G       G       na      GT      na

我的目标是:

2       1150    T       na      na      na      T       G
2       1151    C       na      na      na      T       C
2       1156    A       na      na      na      A       T
2       66907   G       na      na      A       G       na
2       66911   A       na      na      T       A       na
2       73087   C       C       na      C       C       T
2       92846   T       na      na      na      T       G
2       99932   G       G       G       na      GT      na

这似乎有点超出我的技能水平,所以我很感激任何帮助或建议!

2 个答案:

答案 0 :(得分:4)

使用delete arraylength(array)的GNU awk:

$ awk '{delete unq; for (i=4;i<=NF;i++) unq[$i]} length(unq)>2' file
2       1150    T       na      na      na      T       G
2       1151    C       na      na      na      T       C
2       1156    A       na      na      na      A       T
2       66907   G       na      na      A       G       na
2       66911   A       na      na      T       A       na
2       73087   C       C       na      C       C       T
2       92846   T       na      na      na      T       G
2       99932   G       G       G       na      GT      na

delete array自2012年以来实际上已成为POSIX的一部分(请参阅http://austingroupbugs.net/view.php?id=544),而length(array)不仅仅适用于gawk,也适用于其他问题,因此您可以尝试以上就在你的awk上,它可能会起作用,即使它不是gawk。

答案 1 :(得分:2)

为了完整性,一个不依赖于GNU特定功能的版本:

awk '{ c=0; split("",a); for(i=4;i<=NF;++i) if(!a[$i]++) c++ } c>2' file

变量c保留从第4个到最后一个字段中所有唯一条目的计数。 !a[$i]++仅在第一次评估给定值$i时为true,从而标识唯一条目。如果找到两个以上的唯一条目,则打印记录。 split("", a)实现了delete a的效果,因为拆分空字符串会产生一个没有元素的数组。