首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >5个字段的值都不同的awk打印行,忽略丢失的数据。

5个字段的值都不同的awk打印行,忽略丢失的数据。
EN

Stack Overflow用户
提问于 2015-04-20 20:47:56
回答 2查看 74关注 0票数 1

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

下面是我正在处理的数据文件中的几行代码:

代码语言:javascript
复制
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

我的目标是:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-20 20:55:57

用于delete arraylength(array)的GNU

代码语言:javascript
复制
$ 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,它也可能工作。

票数 4
EN

Stack Overflow用户

发布于 2015-04-20 21:19:07

为了完整起见,不依赖于特定于GNU的特性的版本:

代码语言:javascript
复制
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的效果,因为拆分空字符串会导致数组中没有任何元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29758095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档