gpt4 book ai didi

bash 脚本 - 在 sed 中使用模式列表删除子字符串

转载 作者:行者123 更新时间:2023-12-04 02:33:09 24 4
gpt4 key购买 nike

我有一个包含模式列表的文件 (adapters.txt):

cactctttccctacacgacgctcttccg
cactctttccctacacgacgctcttccgaatcta
cactctttccctacacgacgctcttccgaatctaatt
cactctttccctacacgacgctcttccgaatctaatta
cactctttccctacacgacgctcttccgaatctag
cactctttccctacacgacgctcttccgaatctagc
cactctttccctacacgacgctcttccgacctcattcc
cactctttccctacacgacgctcttccgacctcattcccaccctcttccg
cactctttccctacacgacgctcttccgatc
cactctttccctacacgacgctcttccgatccaatt
cactctttccctacacgacgctcttccgatttagc
cactctttccctacacgacgctcttccgatttagct
cactctttccctacacgacgctcttccgatttcattc
cactctttccctacacgacgctcttccgatttcattcttcccc
cactctttccctacacgacgctcttccgattttatttc
cactctttccctacacgacgctcttccggatcta
cactctttccctacacgacgctcttccggatctaatt
cactctttccctacacgacgctcttccggatctaattc
cactctttccctacacgacgctcttccggatctaattca
cactctttccctacacgacgctcttccggatctagctt
cactctttccctacacgacgctcttccggttcta
cactctttccctacacgacgctttccgatcta
cactctttccctacacgacgctttccgatctaattc
cactctttccctacacgacgtcttccgatctaattctggaccatagtgcaatgt
cactctttccctacacgcgctcttccgatcta
cactctttccctacacgcgctcttccgatctaattcg
cactctttccctacacgcgctcttccgatctaattcgg
cactctttccctacacgcgctcttccgatctaattcggcgg
cactctttccctacacgcgctcttccgatctagct
cactctttccctaccgacgctcttccgatcta
cactctttccctacacgacg

我需要从“sequences.fasta”文件中找到并删除这些模式:

>seq01
cactctttccctacacgacgctcttccgWANTEDSEQUENCE
>seq01
cactctttccctacacgacgctcttccgaatctaWANTEDSEQUENCE
>seq03
cactctttccctacacgacgctcttccgaatctaattWANTEDSEQUENCE
>seq04
cactctttccctacacgacgctcttccgaatctaattaWANTEDSEQUENCE
>seq05
cactctttccctacacgcgctcttccgatctaattcggWANTEDSEQUENCE
>seq06
cactctttccctacacgcgctcttccgatctaattcggcggWANTEDSEQUENCE
>seq07
cactctttccctacacgcgctcttccgatctagctWANTEDSEQUENCE
>seq08
cactctttccctaccgacgctcttccgatctaWANTEDSEQUENCE

所以想要的输出应该是:

>seq01
WANTEDSEQUENCE
>seq02
WANTEDSEQUENCE
>seq03
WANTEDSEQUENCE
>seq04
WANTEDSEQUENCE
>seq05
WANTEDSEQUENCE
>seq06
WANTEDSEQUENCE
>seq07
WANTEDSEQUENCE
>seq08
WANTEDSEQUENCE

(只是为了示例,我使用了“WANTEDSEQUENCE”而不是真正的序列)

我已经尝试了以下(和一些变体。我也尝试了 while read):

ADAPS=($(cat adapters.txt))
FASTA="sequences.fasta"


for ADAP in "${ADAPS[@]}";
do
sed "s/${ADAP}//g" "${FASTA}" > output.fasta
done

但是我得到了这个:

>seq01
ctcttccgWANTEDSEQUENCE
>seq01
ctcttccgaatctaWANTEDSEQUENCE
>seq03
ctcttccgaatctaattWANTEDSEQUENCE
>seq04
ctcttccgaatctaattaWANTEDSEQUENCE
>seq05
cactctttccctacacgcgctcttccgatctaattcggWANTEDSEQUENCE
>seq06
cactctttccctacacgcgctcttccgatctaattcggcggWANTEDSEQUENCE
>seq07
cactctttccctacacgcgctcttccgatctagctWANTEDSEQUENCE
>seq08
cactctttccctaccgacgctcttccgatctaWANTEDSEQUENCE

我该如何解决这个问题?

最佳答案

Sort adapters.txt in reverse order by its line length , 创建一个 sed从其输出中提取脚本并将其与 bash 的命令替换一起使用 <(...)第二个sed将其应用于 sequences.fasta :

sed -f <(awk '{ print length, $0 }' adapters.txt | sort -rn | cut -d" " -f2- | sed -E 's/(.*)/s|&||/') sequences.fasta

输出:

>seq01WANTEDSEQUENCE>seq01WANTEDSEQUENCE>seq03WANTEDSEQUENCE>seq04WANTEDSEQUENCE>seq05WANTEDSEQUENCE>seq06WANTEDSEQUENCE>seq07WANTEDSEQUENCE>seq08WANTEDSEQUENCE

The sorting of adapters.txt is necessary because it contains substrings from other strings in the same file.

Same code in multiple lines and files:

awk '{ print length, $0 }' adapters.txt | sort -rn | cut -d" " -f2- > adapters_sorted.txt
sed -E 's/(.*)/s|&||/' adapters_sorted.txt > sed.script
sed -f sed.script sequences.fasta

关于bash 脚本 - 在 sed 中使用模式列表删除子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63044516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com