我试图找出在我的表格文件中的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这似乎有点超出我的技能水平,所以我会感谢任何帮助或建议!
发布于 2015-04-20 20:55:57
用于delete array和length(array)的GNU
$ 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自2012年以来,delete array实际上一直是POSIX的一部分(参见http://austingroupbugs.net/view.php?id=544),length(array)不仅在gawk中可用,而且在其他awk中也是可用的,因此您可以在您的awk上尝试以上这些方法,即使它不是gawk,它也可能工作。
发布于 2015-04-20 21:19:07
为了完整起见,不依赖于特定于GNU的特性的版本:
awk '{ c=0; split("",a); for(i=4;i<=NF;++i) if(!a[$i]++) c++ } c>2' file变量c从第4次到最后一次对字段中的所有唯一条目进行计数。!a[$i]++只在第一次对给定值$i进行计算时才标识唯一条目。如果发现了两个以上的唯一条目,则打印记录。split("", a)实现了delete a的效果,因为拆分空字符串会导致数组中没有任何元素。
https://stackoverflow.com/questions/29758095
复制相似问题