如有一组转录组测序结果的文档:
每个文档是这样的(这里用excel打开方便了解数据结构):
我们需要提取每个文档中的expected_count,也就是第5列的数据。
1、 提取单个文档中的某一列1.1 提取文档中的第5列,并查看:less -S ERR1234561.genes.results | awk '{print $5}' | less -Sawk '{print $5}' 指提取第五列
1.2 提取文档中的第5列,并输出到新的txt文档:awk '{print $5}' ERR1234561.genes.results >ERR1234561.counts.txt1.3 提取文档中的第5列,将列名expected_count修改为ERR1234561,输出到新的txt文档:awk '{print $5}' ERR1234561.genes.results | sed '1s/expected_count/ERR1234561/' >ERR1234561.counts.txtsed '1s/expected_count/ERR1234561/指将第一行的expected_count改为ERR1234561
1.4 提取文档中的第5列,按第1列排序,将列名expected_count修改为ERR1234561,输出到新的txt文档:less -S ERR1234561.genes.results | sort -k 1 | awk '{print $5}' | sed '1s/expected_count/ERR1234561/' >ERR1234561.counts.txtsort -k 1 指按第1列排序
1.5 提取第五列awk '{print $5}'也可以用cut -f 5:less -S ERR1234561.genes.results | sort -k 1 | cut -f 5 | sed '1s/expected_count/ERR1234561/' >ERR1234561.counts.txt2 、提取每个文档的第5列2.1 利用while循环将每个文档的提取命令写入subset.sh,方法1ls *.genes.results | while read iddo echo "less -S ${id} | cut -f 5 | sed '1s/expected_count/${id}/' >${id}.counts.txt"done > subset.sh执行sh命令,输出文档(此时输出后缀.counts.txt的多个单独文档)
sh subset.sh 1>subset.log 2>&1 &1 表示stdout标准输出,2 表示stderr标准错误
此处1>subset.log指标准输出至subset.log,2>&1 也就表示将错误重定向到标准输出1上,也就还是subset.log。
结尾&表示后台运行。
2.2 利用while循环将每个文档的提取命令写入subset.sh,方法2由于提取单个文档的也可以这么写:
cut -f 5 ERR1234561.genes.results | sed '1s/expected_count/ERR1234561/' >ERRERR1234561.counts.txt提取多个文档也可以这么写:
ls *.genes.results | while read iddo echo "cut -f 5 ${id} |sed '1s/expected_count/${id}/' >${id}.counts.txt"done > subset.sh执行sh命令,输出相应文档:
sh subset.sh 1>subset.log 2>&1 &3、按列合并(合并列):按列合并(此时没有行名),输出名为merge.txt的文档:
paste *.counts.txt>merge.txt提取行名,即文档的第一列,输出名为rownames.txt的文档:
cut -f 1 ERR1234561.genes.results >rownames.txt由于每个文档的基因ID是一样,提取其中一个文档的第一列就可以了。
当然要保证每个文档的基因ID顺序是一样的。
将行名加入上述合并数据的文档(实际上还是合并数据):
paste rownames.txt merge.txt >merge2.txt4、若需按行合并(合并行,不适用于