如何计算文件中从“a”到“z”的列中的所有字母,.tsv
并输出告诉我每个字母出现的频率?
例如,假设这是一列
abc
abd
aabf
我想要的输出是这样的:
4 a
3 b
1 c
1 d
1 f
答案1
与grep
,sort
和uniq
:
$ grep -o '[a-z]' file | sort | uniq -c
4 a
3 b
1 c
1 d
1 f
您可以使用以下命令删除前导空格sed
:
$ grep -o '[a-z]' file | sort | uniq -c | sed 's/^ *//'
4 a
3 b
1 c
1 d
1 f
cut
如果您只需要第七列,请在前面添加:
cut -f7 file | grep -o '[a-z]' | sort | uniq -c | sed 's/^ *//'
答案2
答案3
使用列出的工具(cut、sed、sort、uniq),除了 shell 之外不使用其他工具
#!/bin/bash
column=$1
shift
cut -d'\t' -f$column "$@" |
sed 's/[^a-z]//g;s/./&\n/g' |
grep . | sort | uniq -c
使用它来myprog 7 file1 file2
获取 file1 file2 中的第 7 列。
答案4
A珀尔单线救援(没有管道,只有一个过程):
perl -0ane '
map { $h{$_}++ } sort grep { /\w/ } split //, $F[6];
print "$h{$_} $_\n" for sort keys %h
' file
我喜欢 Perl,因为它非常简洁管状连锁呼叫套装。
其背后的想法是创建一个 HASH ( $h
) 并迭代每个字符并计算出现次数:$h->{$_}++
打印之前的哈希值如下所示:
$VAR1 = {
'a' => 4,
'c' => 1,
'f' => 1,
'd' => 1,
'b' => 3
};
输出
4 a
3 b
1 c
1 d
1 f