2016-09-18 2 views
2

У меня есть несколько строк, которые я получаю в порядке, используя следующиеУдалить первые строки, пока совпадения регулярного выражения в колонке

grep ENSG00000006114 File | sort -V 
chr17 35874900 35879174 ABCD0000006114:I25 - 
chr17 35874901 35879174 ABCD0000006114:I25 - 
chr17 35875548 35875671 ABCD0000006114:E27 - 
chr17 35875672 35877289 ABCD0000006114:I26 - 
chr17 35877290 35877445 ABCD0000006114:E26 - 
chr17 35877446 35877932 ABCD0000006114:I25 - 

Однако я хочу, чтобы удалить первые строки, содержащие ': Я в первый ряд, пока я не получаю «Х» для этого я что-то пытаюсь как

grep ENSG00000006114 File | sort -V | awk '{if ($4 ~ /:I/ && NR==1) next};1' 

Однако там может быть более одного вхождения, как и в предыдущем случае в течение первых нескольких строк, так как я исключить строки содержащий: I до первого: E встречается в первой строке, так что моим окончательным результатом будет:

chr17 35875548 35875671 ABCD0000006114:E27 - 
    chr17 35875672 35877289 ABCD0000006114:I26 - 
    chr17 35877290 35877445 ABCD0000006114:E26 - 
    chr17 35877446 35877932 ABCD0000006114:I25 - 

ответ

3

Вы можете использовать AWK:

grep ENSG00000006114 File | sort -V | 
awk 'p==1 && $4 ~ /:E/{p=2} !p && $4 ~ /:I/{p=1} p==1{next} 1' 

chr17 35875548 35875671 ABCD0000006114:E27 - 
chr17 35875672 35877289 ABCD0000006114:I26 - 
chr17 35877290 35877445 ABCD0000006114:E26 - 
chr17 35877446 35877932 ABCD0000006114:I25 - 
  • Когда p==0 & & $4 матчи :I затем мы устанавливаем p=1
  • Хотя p==1 мы пропускаем эту запись и перейти к следующему
  • Когда p==1 & & $4 соответствует :E, тогда мы установили p=2, что позволило сохранить оставшиеся записи для печати.
+2

Большое спасибо (для объяснения также) ..работано! – AishwaryaKulkarni

+0

Это гораздо сложнее, чем должно быть, см. Http://stackoverflow.com/a/39559531/1745001. Может быть, время для кофе ;-). –

+0

Появляется немного больше, потому что OP хочет только пропускать блок из первого ': I' в следующий': E' в '$ 4'. Если нет ': I', нам не нужно пропускать строки до': E' – anubhava

4

Предполагая Grep + сортировки полезны в том порядке, в связи с вашим входным файлом быть огромным, все, что вам нужно от AWK является:

grep ENSG00000006114 File | sort -V | awk '$4~/:E/{f=1} f' 

и если файл не огромно вы можете потерять Grep:

sort -V File | awk '!/ENSG00000006114/{next} $4~/:E/{f=1} f' 
+1

Вы даете самое элегантное и простое решение, которое соответствует данным OP (потому что ** E ** в любом случае не претерпевает ** I **). – blackpen

1

Вы также можете просто перенаправить его обратно к grep:

$ grep ENSG00000006114 File | sort -V | grep -A 10000000000000000 :E 
chr17 35875548 35875671 ABCD0000006114:E27 - 
chr17 35875672 35877289 ABCD0000006114:I26 - 
chr17 35877290 35877445 ABCD0000006114:E26 - 
chr17 35877446 35877932 ABCD0000006114:I25 - 
Смежные вопросы