重击解决方案

重击解决方案

我正在尝试创建植物性状和植物物种的矩阵。数据有 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

相关内容