1

我想知道如何根据两行的总和从包含超过一定数量字符的数据集中删除行。

例如,在以下数据中:

2   rs121065    0   17696224    T   C
2   rs1860485   0   17696230    T   C
2   rs237147    0   17696256    C   CGAGGCAG
2   rs1909633   0   17696365    A   G
2   rs574724    0   17696368    T   C

我想删除第三行。问题是字母系列是可变的,因此在其他地方,数据可能如下所示:

2   rs113308    0   17683654    CCTTT   C

或这个:

2   rs103371    0   17667279    TG  T

所以 - 基本上,需要删除最后两列中包含超过 2 个字符的任何行,理想情况下,我的数据集将如下所示:

2   rs121065    0   17696224    T   C
2   rs1860485   0   17696230    T   C
2   rs1909633   0   17696365    A   G
2   rs574724    0   17696368    T   C

任何建议都非常感谢!

4

3 回答 3

6

基于 R 的解决方案。

假设焦点列被称为seq1seq2

然后

mydata <- subset(mydata,nchar(seq1)+nchar(seq2)==2)

或者如果你真的想使用最后两列,

nc <- ncol(mydata)
mydata <- mydata[nchar(mydata[,ncol-1])+nchar(mydata[,ncol])==2,]

但我发现前者更容易阅读。

于 2013-05-17T16:29:58.873 回答
4

基于awk- 的解决方案:

$ cat foo.txt
2   rs121065    0   17696224    T   C
2   rs1860485   0   17696230    T   CG
2   rs237147    0   17696256    C   CGAGGCAG
2   rs1909633   0   17696365    A   GGG
2   rs574724    0   17696368    T   C

$ awk 'length($NF)==1 && length($(NF-1))==1' foo.txt
2   rs121065    0   17696224    T   C
2   rs574724    0   17696368    T   C

这只保留最后两列每列仅包含一个字符的行。根据需要调整长度要求,这应该是不言自明的。

于 2013-05-17T16:31:51.443 回答
1

简单的sed½ 衬里:

sed '/\w\{2\}\s*\w*$/d' file
于 2013-05-19T09:05:42.750 回答