例如,我有一个很大的 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)