2013-05-17 60 views
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 

任何建議都非常感謝!

+0

當你說「超過2個字符」這是否意味着你要保持有2個字符的一列的列?即你真的是指「超過1個字符?」 – GSee

+0

在總計最後2列之前刪除包含多於1個字符的行,或者在總和之後多於2個字符。 – mfk534

回答

6

基於R的解決方案。

假設焦點列被稱爲seq1seq2

然後

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

,或者如果你真的想用最後兩列,

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

,但我覺得前者更容易閱讀。

+0

正是我需要的。謝謝! – mfk534

+1

+1也許'與'會使第二種方式更具可讀性。使用這將避免依賴於僅用於交互式使用的功能。 –

+1

嗯..似乎需要學習一種語言 - 這對我來說有點神祕:) – jm666

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 

這既保持其最後兩列包含每個只有一個字線。 根據需要調整長度要求,這應該是不言自明的。

+0

謝謝!很高興有選擇。 – mfk534

+0

那個清楚:);) – jm666

1

簡單sed½內膽:

sed '/\w\{2\}\s*\w*$/d' file