如何删除包含缺失值的行

时间:2013-09-23 22:05:27

标签: sed

我有一个包含46列(4 + 42)和5200万行的文件,如:

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或其他东西。 感谢您的帮助和建议。

5 个答案:

答案 0 :(得分:2)

grep -Ev '\. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \.' yourfile

答案 1 :(得分:1)

不是最易读的,但是嘿!,它的

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

答案 2 :(得分:1)

sed'/(。){26} / d'filename

修改

校正:

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

或第一个4之后的可变数量的列:

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

答案 3 :(得分:1)

这可能适合你(GNU sed):

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

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

N.B。最有效的可能是第一个解决方案。

答案 4 :(得分:-1)

一些awk版本

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

这将打印所有没有42的行。使用gsub来计算它们。

awk -F\. NF!=43 file

这会计算使用的字段数。作为分隔符。 (这就是为什么43而不是42)