如果第n列包含特定单词,如何删除行?

时间:2019-05-19 10:25:57

标签: linux bash awk sed terminal

chr1    26150023    26150023    ncRNA_exonic    
chr1    26162313    26162313    exonic      
chr1    26349533    26349535    exonic  
chr1    26357656    26357656    UTR5        
chr1    26487940    26487940    exonic  
chr1    26150023    26150023    ncRNA_exonic    
chr1    26162353    26162313    splicing        
chr1    26349533    26349535    exonic;splicing 
chr1    26357656    26357656    exonic      
chr1    26487940    26487940    UTR3    
chr1    26357656    26357656    intronic        
chr1    26487940    26487940    intergenic

我有一个很大的csv文件,其中包含数十列和数千行。如果这些行的第4列包含除exonic,exonic; splicing,splicing以外的任何字符串,我想删除行。

删除我的文件后,将如下所示:

chr1    26162313    26162313    exonic      
chr1    26349533    26349535    exonic 
chr1    26487940    26487940    exonic  
chr1    26162353    26162313    splicing        
chr1    26349533    26349535    exonic;splicing 
chr1    26357656    26357656    exonic

我尝试使用sed,但是它删除了不需要的行。例如,如果我在第10列中有UTR3,它也会删除该行,而我不希望这样做。 我使用了以下命令:

sed -e '/upstream/d' -e '/downstream/d' -e '/intronic/d' -e '/intergenic/d' -e '/ncRNA_exonic/d' -e '/ncRNA_intronic/d' -e '/ncRNA_splicing/d' -e '/ncRNA_UTR5/d' -e '/UTR3/d' -e '/UTR5/d' input.csv > output.csv 

反正我能得到这份工作吗?

预先感谢

1 个答案:

答案 0 :(得分:4)

使用awk和正则表达式测试第4列。

awk '$4 ~ "^(exonic|exonic;splicing|splicing)$"' file

输出:

chr1    26162313    26162313    exonic      
chr1    26349533    26349535    exonic  
chr1    26487940    26487940    exonic  
chr1    26162353    26162313    splicing        
chr1    26349533    26349535    exonic;splicing 
chr1    26357656    26357656    exonic