我正在尝试创建植物性状和植物物种的矩阵。数据有 2,912,746 行和 3 列。每个物种都有不同数量的性状,并不是每个物种都具有所有性状。数据格式以制表符分隔。
当前格式--
Species Trait Value
Species_1 SLA 4
Species_1 Photopath C3
Species_1 Mycorrhiza AMF
Species_2 SLA 3
Species_2 Growth 10
所需格式--
SLA Photopath Mycorrhiza Growth
Species_1 4 C3 AMF
Species_2 3 10
任何有关这方面的帮助将不胜感激。这是一个相当大的挑战,我不知道从哪里开始。
谢谢你!!!!
〜马克·安东尼
答案1
首先,我建议您将所有数据保存在一个text/plain
文件中,正如您所写,所有数据都是tab delimited
.
然后您可以尝试尝试如何使用过滤列cut
例子
#get first column of a tab delimited file
> cut -f 1 -d $'\t' file
之后,我建议您安装一个数据库引擎(例如)mysql-server
和一个工作台(例如)mysql-workbench
。
然后,如果您愿意,我可以帮助您构建一个带有一些插入功能的索引数据库,这将帮助您轻松插入、获取和分析您现在和将来需要的所有数据。
其他选择
text/plain
就是将该文件的扩展名更改为.csv
并使用LibreOffice Calc
.打开它后,选择制表符作为分隔符。您将能够使用 分析数据pivot tables
,但我不确定如何实现您想要的输出。
重击解决方案
首先,让我们创建一个新目录来使用。
> mkdir test
然后将源文件复制到该新目录。
> cp source test/file
然后进入目录
> cd test
现在,删除文件的第一行(列名行)
> nano file
press ctrl+k, ctrl+x and y
然后对文件进行排序
> sort file > file.sort
获取所有列名
> cut -f 2 -d $'\t' file > cols
为列创建一个目录
> mkdir c
按列拆分所有数据(忽略错误)
> while read i ; do grep "$i" file | cut -f 1,3 -d $'\t' > "c/$i" ; done < cols
连接所有数据并删除重复
> cut -f 1 -d $'\t' file.sort > result
> for f in c/* ; do join result "$f" > tmp ; join -v 1 result "$f" | sed -e 's/$/ -/g' >> tmp ; sort tmp > result ; done
> uniq result