最近,米老鼠经常需要处理大型文本(500M以上),用R和Python感觉有点太慢,所以就直接使用Linux指令处理了。
举个简单的例子,我手上的原文件(700M以上)是这样的格式:
现在我需要将它转换成如下格式:
两个文件的SNP和N是对应的,但是原文件的A1对应新文件的A2,原A2对应新A1,同时原AF1对应新文件的1-freq,BETA和b对应,SE和se对应,P和p对应。
这里我们需要将列名A1与A2互换,同时用1-AF去计算效应等位基因频率(EAF),然后将相关列提取出来并修改一下列名就可以了,这个在R中非常容易实现,但在Linux下其实只需要如下一行代码:
cat mytest.assoc.fastGWA |awk -F "\t" '{print $2,$5,$4,1-$7,$8,$9,$10,$6}'|sed '1d'|sed '1i SNP\tA1\tA2\tfreq\tb\tse\tp\tn'>mytest.ma
该代码主要有4步:
第一步是先用cat指令,将文件输出到显示器上;
第二部使用awk指令选择特定的列(用列数作为索引),-F参数指定文件的分隔符的,这里1-$7其实就是为了计算EAF;
第三步是使用sed指令去掉原文件题头;
第四步也是使用sed指令添加新的题头,各个列名之间使用Tab分隔。
总运行时间在1分钟左右!
一行如此简单的Linux指令就完美地解决了问题!