使用Terminal

时间:2018-12-03 17:43:35

标签: text terminal extract

我想寻求帮助。不幸的是我没有任何编程技能,但我需要进行生物信息学分析。对于下面的问题,我已经通过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 

有人可以提供一个可能产生错误消息的想法吗?

感谢您的耐心等待和提前帮助。

0 个答案:

没有答案