我可以建议将您的文件组转换为CSV格式吗?这几乎就是您所建议的,而且很容易集成到任何处理应用程序中(例如Excel、R、Python)。
首先,我假设所有物种和基因序列都只是字母数字,没有空格或类似引号的字符。我还假设可以访问sed
、sort
和uniq
,它们在*nix、MacOSX中都是标准的,并且可以通过msys或cygwin等方式轻松地在Windows上访问。
首先,生成一个文件名和物种的数组。我假设文件名为file1
、file2
等。只需相应地调整第一行即可;它只是一个glob,而不是一个执行的命令。
FILES=($(file*))
SPECIES=($(sed -ne 's/^>//gp' file* | sort | uniq))
这样我们就可以得到每个物种一个排好序的行,没有重复。这能确保我们的列是独立的且集合是完整的。
接下来,请创建一个带有命名列的 CSV 标题行,并将其转储到名为csvfile
的 CSV 文件中:
echo -n "\"Species\"" > csvfile
for fn in ${FILES[@]} ; do echo -n ",\"${fn}\"" ; done >> csvfile
echo >> csvfile
现在迭代遍历每个基因序列,并从所有文件中提取它:
for sp in ${SPECIES[@]} ; do
echo -n "\"${sp}\""
for fn in ${FILES[@]}; do
ANS=$(sed -ne '/>'${sp}'/,/^/ { /^[^>]/p }' ${fn})
echo -n ",\"${ANS}\""
done
echo
done >> csvfile
这个方法可以工作,但对于更大的数据集(即大量文件和/或物种)来说效率不高。更好的实现方式(例如Python、Ruby、Perl甚至R)将一次性读取每个文件,形成一个内部维护的矩阵、字典或关联数组,并一次性写出CSV。
glob
。不需要写文件名,只需在给定目录中放置*
即可引用所有文件。 - jaypal singh