0

我有一个包含 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 或其他命令)删除这些行。感谢您的任何帮助和建议。

4

5 回答 5

2
grep -Ev '\. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \.' yourfile
于 2013-09-23T22:13:06.507 回答
1

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

perl -ane 'print unless q|.| x 42 eq join q||, @F[4..$#F]' infile 
于 2013-09-23T22:15:37.117 回答
1

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

编辑:

更正:

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

或者对于前 4 列之后的可变数量的列:

sed '/^\([^ ]* \)\{4\}\(\. \)*\./d' filename
于 2013-09-23T22:19:34.430 回答
1

这可能对您有用(GNU sed):

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

或者

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

NB 最有效的可能是第一个解决方案。

于 2013-09-24T12:30:17.703 回答
-1

一些awk版本

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

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

awk -F\. NF!=43 file

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

于 2013-09-24T07:05:38.583 回答