计算文本行中的出现次数
Count occurrences in a text line
有什么方法可以计算一个值在一行中出现的频率吗?。我的输入是制表符分隔的 .txt
文件。它看起来像这样(但有数千行):
#N/A 14 13 #N/A 15 13 #N/A 14 13 13 15 14 13 15 14 14 15
24 26 #N/A 24 22 #N/A 24 26 #N/A 24 26 24 22 24 22 24 26
45 43 45 43 #N/A #N/A #N/A 43 45 45 43 #N/A 47 45 45 43
我想要这样或类似的输出。
#N/A(3) 14 13(3) 15 13(1) 13 15(1) 15 14(1) 14 15 (1)
24 26(4) #N/A(3) 24 22(3)
45 45(4) #N/A(4) 43 45(1) 47 45(1)
awk
救援!
$ awk -F' +' -v OFS=' ' '{for(i=1;i<=NF;i++) if($i!="")a[$i]++;
for(k in a) printf "%s", k"("a[k]")" OFS; delete a; print ""}' file
#N/A(3) 14 13(3) 13 15(1) 15 13(1) 14 15(1) 15 14(1)
#N/A(3) 24 22(3) 24 26(4)
#N/A(4) 43 45(1) 45 43(4) 47 45(1)
Perl 解决方案:
perl -laF'/\t/' -ne '
chomp; my %h;
$h{$_}++ for @F;
print join "\t", map "$_ ($h{$_})", keys %h
' < input
-a
将 -F
上的每一行(\t
表示制表符)拆分为 @F 数组
-l
在打印中添加换行符
-n
逐行读取输入
chomp
删除最后的换行符
- %h 是一个散列table,键是@F 的成员,值是计数
有什么方法可以计算一个值在一行中出现的频率吗?。我的输入是制表符分隔的 .txt
文件。它看起来像这样(但有数千行):
#N/A 14 13 #N/A 15 13 #N/A 14 13 13 15 14 13 15 14 14 15
24 26 #N/A 24 22 #N/A 24 26 #N/A 24 26 24 22 24 22 24 26
45 43 45 43 #N/A #N/A #N/A 43 45 45 43 #N/A 47 45 45 43
我想要这样或类似的输出。
#N/A(3) 14 13(3) 15 13(1) 13 15(1) 15 14(1) 14 15 (1)
24 26(4) #N/A(3) 24 22(3)
45 45(4) #N/A(4) 43 45(1) 47 45(1)
awk
救援!
$ awk -F' +' -v OFS=' ' '{for(i=1;i<=NF;i++) if($i!="")a[$i]++;
for(k in a) printf "%s", k"("a[k]")" OFS; delete a; print ""}' file
#N/A(3) 14 13(3) 13 15(1) 15 13(1) 14 15(1) 15 14(1)
#N/A(3) 24 22(3) 24 26(4)
#N/A(4) 43 45(1) 45 43(4) 47 45(1)
Perl 解决方案:
perl -laF'/\t/' -ne '
chomp; my %h;
$h{$_}++ for @F;
print join "\t", map "$_ ($h{$_})", keys %h
' < input
-a
将-F
上的每一行(\t
表示制表符)拆分为 @F 数组-l
在打印中添加换行符-n
逐行读取输入chomp
删除最后的换行符- %h 是一个散列table,键是@F 的成员,值是计数