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

标签 bash awk sed

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

>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/

相关文章:

linux - 将具有最小大小的子文件夹的路径存储到变量中

linux - 高容量缓冲区 fifo 或使用文件作为 fifo 缓冲区

mysql - 具有多个分隔符的 AWK

awk 平均每列n条数据

bash - 使用 bash (sed/awk) 提取 CSV 文件中的行和列?

shell - 仅当该行与给定模式匹配时,如何删除该行的第一个字符

bash - 使用 Bash 在特定行之前插入文本

bash - 如果 block 在 Bash 中总是转到 else

linux - sed 字符串反转

java - sed 不在 java 程序中工作,但输入行在终端中工作