我们想要按行和列对文本文件进行子集化,其中行数和列数是从文件中读取的。不包括标题(第 1 行)和行名称(第 1 列)。
输入文件.txt制表符分隔的文本文件
header 62 9 3 54 6 1
25 1 2 3 4 5 6
96 1 1 1 1 0 1
72 3 3 3 3 3 3
18 0 1 0 1 1 0
82 1 0 0 0 0 1
77 1 0 1 0 1 1
15 7 7 7 7 7 7
82 0 0 1 1 1 0
37 0 1 0 0 1 0
18 0 1 0 0 1 0
53 0 0 1 0 0 0
57 1 1 1 1 1 1
子集列.txt逗号分隔,无空格,一行,数字有序。在实际数据中,我们有 500K 列,需要子集约 10K。
1,4,6
子集行.txt逗号分隔,无空格,一行,数字有序。在实际数据中,我们有 20K 行,需要大约 300 行子集。
1,3,7
当前解决方案使用cut and awk loop (相关文章:使用 awk 选择行 https://stackoverflow.com/q/27509898):
# define vars
fileInput=inputFile.txt
fileRows=subsetRows.txt
fileCols=subsetCols.txt
fileOutput=result.txt
# cut columns and awk rows
cut -f2- $fileInput | cut -f`cat $fileCols` | sed '1d' | awk -v s=`cat $fileRows` 'BEGIN{split(s, a, ","); for (i in a) b[a[i]]} NR in b' > $fileOutput
输出文件:结果.txt
1 4 6
3 3 3
7 7 7
问题:
该解决方案适用于小文件,对于 50K 行和 200K 列的较大文件,它花费的时间太长,超过 15 分钟,仍在运行。我认为cut选择列工作正常,选择行则较慢。
还有更好的办法吗?
真实输入文件信息:
# $fileInput:
# Rows = 20127
# Cols = 533633
# Size = 31 GB
# $fileCols: 12000 comma separated col numbers
# $fileRows: 300 comma separated row numbers
有关该文件的更多信息:文件包含GWAS https://en.wikipedia.org/wiki/Genome-wide_association_study基因型数据。每行代表样本(个体),每列代表SNP https://en.wikipedia.org/wiki/Single-nucleotide_polymorphism。为了进一步基于区域的分析,我们需要对样本(行)和 SNP(列)进行子集化,以使数据更易于管理(小),作为其他统计软件的输入,例如r /questions/tagged/r.
System:
$ uname -a
Linux nYYY-XXXX ZZZ Tue Dec 18 17:22:54 CST 2012 x86_64 x86_64 x86_64 GNU/Linux
Update:下面提供的解决方案@詹姆斯布朗 https://stackoverflow.com/a/40844004在我的系统中混合列的顺序,因为我使用不同版本的 awk,我的版本是:GNU Awk 3.1.7