2015-03-17 5 views
0

У меня есть файл с ~ 15k строк/записи, такие как это:удалить строки, содержащие несколько строк в оболочке

$ head -50 skato.tsv 
chr gene SKATO.pval SKATO.pmin rho cmaf nsnps.gene 
chr1 NA NA NA NA NA NA 
chr1 SAMD11 0.7068 0.5451 0 0.01214 5 
chr1 NOC2L 0.09887 0.05592 0 0.1926 8 
chr1 KLHL17 0.1262 0.09206 0 0.003241 3 
chr1 PLEKHN1 0.01034 0.2067 0 0.5905 11 
chr1 HES4 0.02433 0.02433 0 0.002427 1 
chr1 ISG15 0.1942 0.1942 1 0.3803 2 
chr1 AGRN 0.8922 0.7151 1 0.115 18 
chr1 C1orf159 0.5763 0.361 0 0.03485 2 
chr1 TTLL10 0.2172 0.1272 0 0.1869 11 
chr1 TNFRSF18 0.4014 0.2909 0 0.01379 6 
chr1 TNFRSF4 0.1456 0.1179 1 0.001619 2 
chr1 SDF4 0.1963 0.1963 0 0.0008104 1 

, что я что удалить все строки, как у второго ряда:

chrx NA NA NA NA NA NA 

Для многих из вас здесь много, но я отчасти разочарован этим. Может ли кто-нибудь помочь мне. Благодарю.

+0

'chrx' подлежит любым строкам? –

+2

Вы хотите удалить строку, которая имеет ровно 6 NA? –

ответ

1

Это может работать для вас (GNU СЭД):

sed -r '/(\s+NA){6}/d' file 

Удалить все строки с 6 или больше требуемой строки

sed '/\(\s\s*NA\)\{6\}/d' file 

Должен также работать для большинства садов.

0

Попробуйте что-то вроде:

egrep -v "chr[0-9]+\s+NA\s+NA" myfile.txt 

Или, если вы хотите придерживаться СЕПГ, то

sed -r -i.bak "/chr[0-9]+\s+NA\s+NA/d" myfile.txt ##add multiple NA's that you wish to check for 

, который будет создавать обратно файл перед фактическим удалением строки

1

Вы можете попробовать ниже команды sed.

sed '/^chr[0-9]\+\([[:blank:]]\+NA\)\+$/d' file 

Это удалит все линии, у которых есть один или несколько NA.

+0

Спасибо. Но это неполно. Некоторые строки все еще существуют. –

+0

попробуйте 'sed '/^chr [0-9] \ + \ ([[: blank:]] \ + NA \) \ + [[: blank:]] * $/d'', все равно это не будет затем опубликуйте формат этих строк. –

0

Я хотел бы использовать:

grep -vP '^chr\d+(\s+NA){6}\s*$' <infile >outfile 
Смежные вопросы