gpt4 book ai didi

bash - 删除超过 30% 小写字母的行

转载 作者:行者123 更新时间:2023-11-29 09:18:54 24 4
gpt4 key购买 nike

我尝试处理一些数据,但找不到解决我的问题的有效解决方案。我有一个看起来像这样的文件:

>ram
cacacacacacacacacatatacacatacacatacacacacacacacacacacacacaca
cacacacacacacaca
>pam
GAATGTCAAAAAAAAAAAAAAAAActctctct
>sam
AATTGGCCAATTGGCAATTCCGGAATTCaattggccaattccggaattccaattccgg

and many lines more....

我想过滤掉序列字符串(不以 > 开头的那些)包含 30% 或更多小写字母的所有行和相应的标题(标题以 > 开头)。并且序列字符串可以跨越多行。

所以在命令 xy 之后输出应该是这样的:

>pam
GAATGTCAAAAAAAAAAAAAAAAActctctct

我尝试了 while 循环的一些混合来读取输入文件,然后使用 awk、grep、sed,但没有好的结果。

最佳答案

这里有一个想法,将记录分隔符设置为“>”,以将每个 header 及其序列行视为单个记录。

因为输入以“>”开头,这会导致初始记录为空,所以我们使用 NR > 1(记录数大于 1)保护计算。

为了计算字符数,我们在标题后添加了所有行的长度。为了计算小写字符的数量,我们将字符串保存在另一个变量中,并使用 gsub 将所有小写字母替换为空——只是因为 gsub 返回所做的替换次数,这是一种方便的计数方式他们。

最后我们检查比率并打印或不打印(打印时加回首字母“>”)。

BEGIN { RS = ">" }

NR > 1 {
total_cnt = 0
lower_cnt = 0
for (i=2; i<=NF; ++i) {
total_cnt += length($i)
s = $i
lower_cnt += gsub(/[a-z]/, "", s)
}
ratio = lower_cnt / total_cnt
if (ratio < 0.3) print ">"$0
}


$ awk -f seq.awk seq.txt
>pam
GAATGTCAAAAAAAAAAAAAAAAActctctct

关于bash - 删除超过 30% 小写字母的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42370556/

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