awk - Sed/awk : how to find and remove two lines if a pattern in the first line is being repeated; bash

标签 awk sed grep fasta

我正在处理每个文件包含数千条记录的文本文件。每条记录由两行组成:一个以“">”开头的标题,后面跟着一行包含一长串字符“-AGTCNR”的行。 header 有 10 个字段,用“|”分隔其第一个字段是每个记录的唯一标识符,例如“>KEN096-15”,如果记录具有相同的标识符,则该记录被称为重复记录。简单的记录如下所示:

>ACML500-12|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_-2  
----TAAGATTTTGACTTCTTCCCCCATCATCAAGAAGAATTGT-------  
>ACRJP458-10|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
-----------TCCCTTTAATACTAGGAGCCCCTGACATAGCCTTTCCTAAATAAT-----  
>ASILO303-17|Dip|gs-Par|sp-Par vid|subsp-NA|co  
-------TAAGATTCTGATTACTCCCCCCCTCTCTAACTCTTCTTCTTCTATAGTAGATG  
>ASILO326-17|Dip|gs-Goe|sp-Goe par|subsp-NA|c  
TAAGATTTTGATTATTACCCCCTTCATTAACCAGGAACAGGATGA---------------  
>CLT100-09|Lep|gs-Col|sp-Col elg|subsp-NA|co-Buru  
AACATTATATTTGGAATTT-------GATCAGGAATAGTCGGAACTTCTCTGAA------  
>PMANL2431-12|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_  
----ATGCCTATTATAATTGGAGGATTTGGAAAACCTTTAATATT----CCGAAT  
>STBOD057-09|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
ATCTAATATTGCACATAGAGGAACCTCNGTATTTTTTCTCTCCATCT------TTAG  
>TBBUT582-11|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
-----CCCCCTCATTAACATTACTAAGTTGAAAATGGAGCAGGAACAGGATGA  
>TBBUT583-11|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
TAAGATTTTGACTCATTAA----------------AATGGAGCAGGAACAGGATGA  
>AFBTB001-09|Col|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N  
TAAGCTCCATCC-------------TAGAAAGAGGGG---------GGGTGA  
>PMANL2431-12|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_  
----ATGCCTATTAGGAAATTGATTAGTACCTTTAATATT----CCGAAT---  
>AFBTB003-09|Col|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N  
TAAGATTTTGACTTCTGC------CATGAGAAAGA-------------AGGGTGA  
>AFBTB002-09|Cole|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N  
-------TCTTCTGCTCAT-------GGGGCAGGAACAGGG----------TGA  
>ACRJP458-10|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
-----------TCCCTTTAATACTAGGAGCCCCTTTCCT----TAAATAAT-----  

现在我正在尝试删除重复项,例如“ACRJP458-10”和“PMANL2431-12”的重复记录。 使用 bash 脚本,我提取了唯一标识符并将重复的标识符存储在变量“$duplicate_headers”中。目前,我正在尝试查找其两行记录的任何重复实例并删除它们,如下所示:

for i in "$@"
do
    unset duplicate_headers
    duplicate_headers=`grep ">" $1 | awk 'BEGIN { FS="|"}; {print $1 "\n"; }' | sort | uniq -d`
    for header in `echo -e "${duplicate_headers}"`
    do
        sed -i "/^.*\b${header}\b.*$/,+1 2d" $i
        #sed -i "s/^.*\b${header}\b.*$//,+1 2g" $i
        #sed -i "/^.*\b${header}\b.*$/{$!N; s/.*//2g; }" $i
    done
done

最终结果(考虑到数千条记录)将如下所示:

>ACML500-12|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_-2  
----TAAGATTTTGACTTCTTCCCCCATCATCAAGAAGAATTGT-------  
>ACRJP458-10|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
-----------TCCCTTTAATACTAGGAGCCCCTGACATAGCCTTTCCTAAATAAT-----  
>ASILO303-17|Dip|gs-Par|sp-Par vid|subsp-NA|co  
-------TAAGATTCTGATTACTCCCCCCCTCTCTAACTCTTCTTCTTCTATAGTAGATG  
>ASILO326-17|Dip|gs-Goe|sp-Goe par|subsp-NA|c  
TAAGATTTTGATTATTACCCCCTTCATTAACCAGGAACAGGATGA---------------  
>CLT100-09|Lep|gs-Col|sp-Col elg|subsp-NA|co-Buru  
AACATTATATTTGGAATTT-------GATCAGGAATAGTCGGAACTTCTCTGAA------  
>PMANL2431-12|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_  
----ATGCCTATTATAATTGGAGGATTTGGAAAACCTTTAATATT----CCGAAT  
>STBOD057-09|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
ATCTAATATTGCACATAGAGGAACCTCNGTATTTTTTCTCTCCATCT------TTAG  
>TBBUT582-11|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
-----CCCCCTCATTAACATTACTAAGTTGAAAATGGAGCAGGAACAGGATGA  
>TBBUT583-11|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N  
TAAGATTTTGACTCATTAA----------------AATGGAGCAGGAACAGGATGA  
>AFBTB001-09|Col|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N  
TAAGCTCCATCC-------------TAGAAAGAGGGG---------GGGTGA  
>AFBTB003-09|Col|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N  
TAAGATTTTGACTTCTGC------CATGAGAAAGA-------------AGGGTGA  
>AFBTB002-09|Cole|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N  
-------TCTTCTGCTCAT-------GGGGCAGGAACAGGG----------TGA

最佳答案

$ awk -F'[|]' 'NR%2{f=seen[$1]++} !f' file
>ACML500-12|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_-2
----TAAGATTTTGACTTCTTCCCCCATCATCAAGAAGAATTGT-------
>ACRJP458-10|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N
-----------TCCCTTTAATACTAGGAGCCCCTGACATAGCCTTTCCTAAATAAT-----
>ASILO303-17|Dip|gs-Par|sp-Par vid|subsp-NA|co
-------TAAGATTCTGATTACTCCCCCCCTCTCTAACTCTTCTTCTTCTATAGTAGATG
>ASILO326-17|Dip|gs-Goe|sp-Goe par|subsp-NA|c
TAAGATTTTGATTATTACCCCCTTCATTAACCAGGAACAGGATGA---------------
>CLT100-09|Lep|gs-Col|sp-Col elg|subsp-NA|co-Buru
AACATTATATTTGGAATTT-------GATCAGGAATAGTCGGAACTTCTCTGAA------
>PMANL2431-12|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_
----ATGCCTATTATAATTGGAGGATTTGGAAAACCTTTAATATT----CCGAAT
>STBOD057-09|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N
ATCTAATATTGCACATAGAGGAACCTCNGTATTTTTTCTCTCCATCT------TTAG
>TBBUT582-11|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N
-----CCCCCTCATTAACATTACTAAGTTGAAAATGGAGCAGGAACAGGATGA
>TBBUT583-11|Lep|gs-NA|sp-NA|subsp-NA|co-Buru|site-NA|lat_N
TAAGATTTTGACTCATTAA----------------AATGGAGCAGGAACAGGATGA
>AFBTB001-09|Col|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N
TAAGCTCCATCC-------------TAGAAAGAGGGG---------GGGTGA
>AFBTB003-09|Col|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N
TAAGATTTTGACTTCTGC------CATGAGAAAGA-------------AGGGTGA
>AFBTB002-09|Cole|gs-NA|sp-NA|subsp-NA|co-Ethi|site-NA|lat_N
-------TCTTCTGCTCAT-------GGGGCAGGAACAGGG----------TGA

要同时在多个文件上运行它,可以删除所有文件中的重复项:

awk -F'[|]' 'FNR%2{f=seen[$1]++} !f' *

或者仅删除每个文件中的重复项:

awk -F'[|]' 'FNR==1{delete seen} FNR%2{f=seen[$1]++} !f' *

关于awk - Sed/awk : how to find and remove two lines if a pattern in the first line is being repeated; bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56131068/

相关文章:

regex - 从 ifconfig 解析接口(interface)

linux - 在每行匹配后使用 grep 获取下一个 WORD

linux - 根据另一个文件中的列对文件进行排序

regex - 狂欢 : regular expressions within backticks

vim - 在关键字后添加常量

bash - 尝试格式化音乐文件的名称

perl - 如何仅更改文件的第一行?

linux - 如何测试文件中的某些字符

regex - sed 替换文件名以引号开头

linux - 使用排序从列表中删除行,grep LINUX