我试图弄清楚我的表格文件中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
这似乎有点超出我的技能水平,所以我很感激任何帮助或建议!
答案 0 :(得分:4)
使用delete array
和length(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
的效果,因为拆分空字符串会产生一个没有元素的数组。