我有一个包含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或其他东西。 感谢您的帮助和建议。
答案 0 :(得分:2)
grep -Ev '\. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \.' yourfile
答案 1 :(得分:1)
不是最易读的,但是嘿!,它的perl:
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)