我有一个看起来像这样的文本文件:
A A A G A A
A A A A A A
G A G A G G
A G G G G G
G A A A A A
T C T C C C
A A A G A A
C C C C C C
T G G G G G
T T T T T T
我想逐行计算每个字母的出现次数。关于按字段执行此操作有相当多的文档,但不是按行。我一直在想:
for(i=1; i <= NF, i++)
循环遍历每一行中的列,然后创建一个计数器变量以将事件添加到。有更简单的方法吗?
答案 0 :(得分:1)
我对awk不太满意,这是一个perl版本:
perl -ne 'my %c; $c{$_}++ for split; print scalar keys %c'
输出
212222212
如果您愿意,请添加换行符
perl -ne 'my %c; $c{$_}++ for split; print scalar keys %c . "\n"'
修改强>
对评论的反应,也许这更像你的意思:
perl -ne 'my %c; $c{$_}++ for split; print "$_:$c{$_} " for keys %c; print "\n"'
输出:
A:5 G:1
A:6
A:2 G:4
A:1 G:5
A:5 G:1
T:2 C:4
A:5 G:1
C:6
T:1 G:5
T:6
答案 1 :(得分:0)
在awk中,我认为没有更简单的方法来迭代一行中的字段。
awk '
{
delete a
for (i=1; i<=NF; i++)
a[$i]++
printf("%d -- ", NR)
for (val in a)
printf("%s:%d, ", val, a[val])
print ""
}
'
根据您的输入,此输出
1 -- A:5, G:1,
2 -- A:6,
3 -- A:2, G:4,
4 -- A:1, G:5,
5 -- A:5, G:1,
6 -- C:4, T:2,
7 -- A:5, G:1,
8 -- C:6,
9 -- G:5, T:1,
10 -- T:6,