2013-09-23 93 views
0

我有46列(4 + 42)和52萬行像一個文件:如何刪除含有缺失值線

chr1 rs423246 102 120543 0 2 2 1 1 0 . . . -1 2 2 0 0 . . . . . 2 1 1 -1 -1 
chr1 rs245622 104 134506 2 2 2 1 0 0 0 2 2 2 -1 -1 . . . 2 2 1 1 1 1 1 1 . 2 
chr1 rs267845 105 124564 . . . . . . . . . . . . . . . . . . . . . . . . . . 
chr1 rs234579 106 125642 2 2 2 1 0 0 0 -1 -1 -1 1 0 0 2 1 0 . . . 2 . . 2 1 0 

我想刪除已經針對所有42缺失值只有線列。 我的缺失值是「。」 (例如上面例子中的第3行應該被刪除) 我如何使用Unix中的命令(比如BWK SED或其他)刪除這些行。 感謝您的任何幫助和建議。

回答

2
grep -Ev '\. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \.' yourfile 
+0

等一下,是不是在這裏匹配任何字符?您可能需要添加42個斜線! –

1

不是最可讀,但嘿!其

perl -ane 'print unless q|.| x 42 eq join q||, @F[4..$#F]' infile 
1

sed的 '/ {26}/d(。)' 文件名

編輯:

糾錯:

sed '/\(\.\)\{42\}/d' filename 

或首4後列的可變數目:

sed '/^\([^ ]* \)\{4\}\(\. \)*\./d' filename 
+0

你的命令有效,但你能解釋一下爲什麼你選擇了26.當我從原始文件中刪除40行(38行缺少)並使用你的命令時,它只保留1行輸出並刪除其他人,儘管我有2行。請幫忙!謝謝 – Maher

+0

@Maher:我看到了問題。在你的例子中,這些行被截斷;第3行以26點結束。我忽略了你的描述(「4 + 42」),贊成這個例子。我會糾正我的答案。 – Beta

-1

一些awk verison

awk '{a=$0} gsub(/\./,x)!=42 {print a}' file 

這將打印不具有42所有線。使用gsub來計算它們。

awk -F\. NF!=43 file 

這個計數使用的字段數。作爲分隔符。 (這就是爲什麼43,而不是42)

+1

如果前三列中有一個點,而最後42列中有一個點,則這兩個命令都將刪除該行... – chickegg

+0

如果數據一致,它將起作用,但您是正確的。 – Jotne

1

這可能會爲你工作(GNU SED):

sed -r '/(\.\s*){42}$/d' /file 

sed 's/\./&/42;T;d' file 

注:最有效的可能是第一個解決方案。