while read -r line
do
if [[ ${line:0:1} == '>' ]]; then
if [[ -n $count ]]; then
printf "%d\n" $count
fi
count=0
echo "$line"
else
((count += $(grep -o 1 <<< "$line" | wc -l)))
fi
done < fasta_file
if [[ -n $count ]]; then
printf "%d\n" $count
fi
while read -r line
do
if [[ ${line:0:1} == '>' ]]; then
if [[ -n $count ]]; then
printf "%d\n" $count
fi
count=0
echo "$line"
else
line="${line//[^1]/}" # remove everything but 1's
((count += ${#line})) # add the length of line to count
fi
done < fasta_file
if [[ -n $count ]]; then
printf "%d\n" $count
fi
awk '
/^>/ { print ; next } # print lines starting with ">"; skip to next input line
{ print gsub(/1/,"x") } # replace all "1" characters with dummy "x"; gsub() returns number of replacements (ie, number of "1" characters in the line)
' file
9条答案
按热度按时间uurity8g1#
grep -c 1
将为您提供匹配 * 行 * 的数量,而不是1
的总数。您可以使用grep -o
使其仅在单独的行上打印每个匹配行的匹配部分,然后使用wc -l
计算行数。或者在纯bash中使用参数展开:
perl中的类似设置:
音译运算符
tr///
将返回它执行了多少次音译,由于1
是唯一的参数,因此它将与计算1
的参数相同。rks48beu2#
也可以写成
但现有的解决方案都不适用于后者。
对于上面显示的两个文件,程序输出
3bygqnnd3#
一 个
awk
创意 :中 的 每 一 个
或者 作为 一 句 俏皮 话 :
格式
折叠 成 一 个 三元 运算 符 来 确定
print
:格式
这些 都 产生 :
格式
rslzwgfq4#
假设您的fasta按照您指定的格式进行了格式化,并且假设使用
awk
是可以接受的,那么下面的代码可能会起作用:(Note:awk命令按“1”拆分字符串,然后输出结果字段数减1)
fasta.txt:
输出量:
根据@ikegami,如果记录分布在多行上:
zf9nrax15#
下面是同样适用于多行记录的
gnu-awk
解决方案:aydmsdu96#
使用您展示的示例,请尝试以下
awk
代码。在GNUawk
中编写和测试,应该可以在任何awk
中工作。***说明:***简单的说明是,检查条件,如果行从
>
开始,则打印该行,next
将跳过此处的所有后续语句。然后使用print
函数,检查NF
是否为NOT NULL,然后使用split
函数将当前行拆分为数组arr,分隔符为1
(它将提供当前行中存在的1的数量,执行-1
将给予准确的计数),否则NF
为NOT NULL,然后打印0
(对于空行)。yrdbyhpb7#
要在
awk
的单个示例下处理一个标头上的多行数据-不像这里的其他版本那么优雅,但可能更容易阅读和理解。YMMV。
j8ag8udp8#
如果您确实想要其他2行:
如果您需要多行打印机:
|
o8x7eapl9#