我想寻求帮助。不幸的是我没有任何编程技能,但我需要进行生物信息学分析。对于下面的问题,我已经通过Google搜索了解决方案,但是我发现的解决方案(即使在stackoverflow上)也无法解决我的问题,也无法弄清原因。因此,我将不胜感激。
简而言之:我想基于另一个文件中的列表从文本文件中提取某些列。我想使用终端命令。
我有一个巨大的文本文件(data.txt)(2,8GB),其中包含52000行和大约11000列。第一行是标题。
它看起来像这样:
**data.txt**
name GTEX-144GN-2326-SM-5B26N GTEX-145MF-0626-SM-5B47S ...
gene1 33.2 23.2 ...
我有一个列表文件(list.txt),其中包含我想从data.txt提取到新文件(results.txt)的列的名称:
**list.txt**
GTEX-144GN-2326-SM-5B26N
GTEX-145MF-0626-SM-5B47S
GTEX-13OW5-0126-SM-5BEY3
...
我已经尝试了来自名为dogbane的用户的以下解决方案: Extract columns from a file based on header selected from another file 但是它生成了一个22GB的文件,我什至无法打开。
然后我尝试了另一种解决方案:
cols=($(sed '1!d;s/, /\n/g' data.txt | grep -nf list.txt | sed 's/:.*$//'))
cut -d ',' -f 1$(printf ",%s" "${cols[@]}") data.txt > result.txt
但是它只给了我第一列。
然后我遇到了同样的问题:
head -n1 data.txt | tr '\t' '\n' | grep -nf list.txt | cut -f1 -d: | paste -sd, | xargs -I{} cut -f {} data.txt > results.txt
如果有人可以向我展示一个更简单且可行的解决方案,我将不胜感激。或者至少可以指出我所看过的细节。 这个问题可能是多余的,但是这里的解决方案可能有所不同?
编辑:
我在R中找到了一种方法,但是它仅适用于小型表/矩阵,但不适用于2GB矩阵。在一张小桌子上,此方法有效。
通过以下方式加载表格:
table <- read.table("c:/test.txt")
# then converting first row into headers
colnames(table) <- as.character(unlist(table[1,]))
# loading the list file that contains the column names to be extracted from table
list <- scan("c:/list.txt", character(), quote = "")
#Then extracting columns based on names in list:
results <- table[,list]
但是,当我在较大的2gb矩阵上尝试此方法时,出现错误消息:
results <- table[,list]
Error in `[.data.frame`(table, , list) : undefined columns selected
有人可以提供一个可能产生错误消息的想法吗?
感谢您的耐心等待和提前帮助。