我有一些使用以下
按顺序排列的行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 -
但是我想要删除包含'的第一行:I'在第一行直到我得到':E'因为我一直在尝试像
这样的东西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 -
答案 0 :(得分:4)
假设由于您的输入文件很大,grep + sort在该顺序中很有用,您只需要从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 :(得分: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 :(得分: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 -