使用sed根据缺失的信息删除行

时间:2013-01-30 19:50:48

标签: unix sed design-patterns data-management

我有一个非常具体的数据集,但是很不方便,像这样:

data <- textConnection("rs1050,15,234323,C,T
1,7329,0.1147,-0.0024,0.0048
1,9810,0.6399,0.001174,0.006095
1,16550,0.648541108,0.0061,0.0070
rs7895,NA,NA,A,C
1,997,NA,NA,0.0732
1,9810,0.0339,-0.016131,0.021611
1,16550,0.32739678,0.0014,0.0053
rs995,18,100336,C,T
1,7385,0.2692,-0.0063,0.0035
1,9810,0.5397,-0.002697,0.006012
1,16550,0.651147483,-0.0045,0.0053")
test_data <- read.csv(data, header = FALSE, sep = ",")

如果包含rs####的行包含NA(在一列或多列中),则需要将其删除。这本身就没有问题,但在这种情况下,还需要删除该行下面的三行(无论这些行中是否存在所有数据)。

因此,在上述数据的情况下,将删除第5-8行。

任何解决方案都会很棒,但到目前为止我的努力都是基于sed。像这样的东西?

sed -i '/rs*\t*\tNA\tNA\t*/~1-3d' test_data

sed -i '/rs*\t*\tNA\tNA\t*/,+3d' test_data

我觉得我很亲近,任何想法都会受到赞赏!

3 个答案:

答案 0 :(得分:1)

这应该没问题,除非您的实际数据有培训") ...

sed  '/^rs.*NA/,+3d' test_data 

答案 1 :(得分:0)

sed '/^rs[0-9]+\tNA\tNA\t/,+3d' <input_data >output_data

答案 2 :(得分:0)

使用awk

的强制替代方案
awk '/^rs.*NA/ { output = 0; } /^rs/ && !/NA/ { output = 1; } output { print }'

可能会更好一点优化,但对于读者来说,这是一个众所周知的练习......

这有三个部分 - 如果一行以rs开头且包含NA,则会关闭output变量。如果一行以rs开头且不包含NA,则会重新开启output。然后,如果output当前处于启用状态,则会打印该行,无论其是否包含rsNA