我想知道如何根据两行的总和从数据集中删除包含超过一定数量字符的行。
例如,在以下数据中:
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
非常感谢任何建议!
答案 0 :(得分:6)
基于R的解决方案。
我们说焦点列名为seq1
和seq2
。
然后
mydata <- subset(mydata,nchar(seq1)+nchar(seq2)==2)
或者如果你真的想要使用最后两列,
nc <- ncol(mydata)
mydata <- mydata[nchar(mydata[,ncol-1])+nchar(mydata[,ncol])==2,]
但我发现前者更容易阅读。
答案 1 :(得分: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
这只保留最后两列只包含一个字符的行。 根据需要调整长度要求,这应该是不言自明的。
答案 2 :(得分:1)
简单sed
½衬垫:
sed '/\w\{2\}\s*\w*$/d' file