计算所有 csv 的频率值

计算所有 csv 的频率值

例如,我有一个很大的 csv 文件(没有标题或索引)

A T C G
G T A C
CT T A G
G G G G

我想要计算所有 csv 中的所有值(不针对特殊的列或行),输出将是:

A 3
T 3
C 2
G 7
CT 1

我怎样才能用 Linux 做到这一点?

答案1

有很多方法可以使用任意数量的编程语言来实现这一点,但是,如果您正在寻找可以在任何基于 Linux 的机器上运行而不需要额外库的东西,您可以执行以下操作:

cat {filename} | tr -s ' ' '\n' | sort | uniq -c | sort -r | awk '{ print $2, $1 }'

笔记:务必更换仅有的 {filename}其中包含您想要解析的数据的文件的名称。

使用示例数据集多次复制到文件中得出以下结果:

G 77
T 33
A 33
C 22
CT 11

工作原理

这实际上是多个常见 Linux 命令的组合。它们的工作原理如下

命令 它能做什么
cat {filename} 读取给定文件
tr -s ' ' '\n' 将空格翻译(或音译,取决于你问谁)为换行符,将所有字符串放在不同的行上。
sort 对字符串进行排序
uniq -c 计算唯一字符串
sort -r 反转排序结果
awk '{ print $2, $1 }' 扫描排序后的数据并以提供的格式输出数据

请注意,如果您对几 GB 大小的文件使用它,您将需要有一台具有足够内存或正确配置的机器来正确管理其内存。

答案2

要查找 A(单独)在您的文件中出现的次数,您只需执行以下操作:

grep -ow 'A' filename.txt | wc -l

因此,对于您来说,您可以执行以下操作:

echo "Count of A:" $(grep -ow 'A' filename.txt | wc -l)
echo "Count of C:" $(grep -ow 'C' filename.txt | wc -l)
echo "Count of T:" $(grep -ow 'T' filename.txt | wc -l)
echo "Count of G:" $(grep -ow 'G' filename.txt | wc -l)
echo "Count of TC:" $(grep -ow 'TC' filename.txt | wc -l)

相关内容