2014-03-07 50 views
0

我使用巨大的文件(基因表达文件);每列代表一个样本,每行代表一个特异性探针的表达(每个样本使用相同的探针)。例如,如何用awk进行多次传递?

的Sample1

PROBE1
PROBE2
...
ProbeN

我可以有43000+探针和> 50个样品。尽管我可以在技术上使用二维数组,但是一旦我获得了更多样本的文件,这将不再有效。因此,我正在考虑对同一文件进行多次传递(每次都是新列),对每列应用算法,将结果打印在单独的文件中。

我试过一个倒带功能重新开始,但程序不遵循相同的说明。

for(i = ARGC; i > ARGIND; i--) 
    ARGV[i] = ARGV[i-1] 

ARGC++ 
ARGV[ARGIND+1] = FILENAME 

nextfile 

你有什么想法吗?

谢谢!

+0

如果您可以发布一些示例数据以及期望的输出。 –

+0

并需要两个样本数据作为输入文件。 – BMW

回答

1

从内存使用的角度来看,这听起来像是一个管道和shell脚本的工作。如果awk脚本从标准输入输入它的输入,将其输出写入标准输出,并将列号作为参数,则可以轻松实现所需。它也可以让你在一个循环中或者在一个带有多个管道的命令行中工作。

cat gene-file.in | awk -f yourscript.awk -v col=1 | awk -f yourscript.awk -v col=2 | awk -f yourscript.awk -v col=3 > gene-file.out 

..或..

#!/bin/bash 
cp gene-file.in gene-file.tmp.1 
for ((col = 1 ; col <= 10 ; col++)) ; do 
    awk -f yourscript.awk -v col=$col gene-file.tmp.1 > gene-file.tmp.2 
    mv gene-file.tmp.2 gene-file.tmp.1 
done 
mv gene-file.tmp.1 gene-file.out 

或任意数量的完成同样的事情的替代方式。 由于更多的文件写入,这种做事的方式会变慢。但是写50次以上的文件并不是很大。您的光盘缓存将很好应对。

+0

没有必要使用带有'awk'的'cat',它可以读取文件本身。 – Jotne

+0

是的,这种方法是为了说明,整个第一行是一个管道。看第二个例子,它使用一个文件名参数。 –

+0

嗨保罗。非常感谢您的意见。我从来没有在shell脚本中使用过awk,而且我想知道我是否可以问你一些其他问题: – Johnathan

0

我被击败了,但由于我已经做了这个 - 这里是一个类似于保罗希克斯的例子,它会将每列的内容追加到基于列名的文件中。

#!/bin/bash 

fieldCnt=$(head -n1 $1 | awk '{print NF}') 
cnt=1 
while [ $cnt -le $fieldCnt ] 
do 
    awk 'out==""{out=FILENAME"."v} {print $v >> out} END{close(out)}' v=$cnt $1 
    cnt=$((cnt+1)) 
done 

如果数据文件名是data,那就做一个data.1data.2到文件中的列数。你会把它叫做myscript data。您可以在循环中将探测工作添加到awk的主体(或者将其放入文件并使用awk -f awkfile v=$cnt $1,例如Paul Hicks的示例)