2015-10-09 56 views
0

我想结合$2中相同的文本,并将它们输出到单独的文件中,匹配项是新文件的名称。由于实际文件相当大,我打开每个文件,然后关闭以节省速度和内存,我的尝试如下。谢谢 :)。awk输出匹配来分开文件

awk '{printf "%s\n", $2==$2".txt"; close($2".txt")}' input.txt **'{ print $2 > "$2.txt" }'** 

input.txt中

chr19:41848059-41848167 TGFB1:exon.2;TGFB1:exon.3;TGFB1:exon.4 284.611 108 bases 
chr15:89850833-89850913 FANCI:exon.20;FANCI:exon.27;FANCI:exon.32;FANCI:exon.33;FANCI:exon.34 402.012 80 bases 
chr15:31210356-31210508 FANC1:exon.6;FANC1:exon.7 340.914 152 bases 
chr19:41850636-41850784 TGFB1:exon.1;TGFB1:exon.2;TGFB1:exon.3 621.527 148 bases 

希望的输出为TGFB1.txt

chr19:41848059-41848167 TGFB1:exon.2;TGFB1:exon.3;TGFB1:exon.4 284.611 108 bases 
chr19:41850636-41850784 TGFB1:exon.1;TGFB1:exon.2;TGFB1:exon.3 621.527 148 bases 

希望的输出为FANC1.txt

chr15:89850833-89850913 FANCI:exon.20;FANCI:exon.27;FANCI:exon.32;FANCI:exon.33;FANCI:exon.34 402.012 80 bases 
chr15:31210356-31210508 FANC1:exon.6;FANC1:exon.7 340.914 152 bases 

编辑:

awk -F '[ :]' '{f = $3 ".txt"; close($3 ".txt")} print > f}' BMF_unix_loop_genes_IonXpress_008_150902_loop_genes_average_IonXpress_008_150902.bed > /home/cmccabe/Desktop/panels/BMF **/"$f".txt;** 
bash: /home/cmccabe/Desktop/panels/BMF: Is a directory 
+1

[重定向'print'和'printf'的输出](http://www.gnu.org/software/gawk/manual/gawk.html#Redirection) –

+1

在'awk'中我添加了一个编辑以重定向输出。那是对的吗?谢谢 :)。 – Chris

+2

请勿使用答案编辑帖子。如果您认为它有用并且接受它,请发布答案。至于这是否正确。试试看看。 –

回答

2

您只需重新定义字段分隔符包括冒号,然后该文件的名称将是$ 3

awk -F '[ :]' '{f = $3 ".txt"; print > f}' input.txt 

我遇到了一些awks其中构建文件名以重定向的权利是有问题的问题,这就是为什么我使用的是杂物BLE。然而,周五下午的啤酒车已经出现,我不记得具体的细节:/

我不会打扰关闭文件,除非您预计会生成数百或数千个新文件。

+0

非常感谢大家,明天我会试一试,让你知道:)。 – Chris

+0

在编辑中,我添加了一个'awk',但在尝试将新文件重定向到目录时出现错误。谢谢 :)。我也期待数百个文件如此添加结束:)。 – Chris

2

你需要的第二个字段拆分为所需的字段名称。这应该做

$ awk 'BEGIN{close(p)} {split($2,f,":"); p=f[1]".txt"; print $0 > p }' file 

注意,它不会产生您的输出正是因为你的领域之一,有一个错字

$ ls *.txt 
FANC1.txt FANCI.txt TGFB1.txt 
+1

BEGIN块的用途是什么? –

+1

哎呀,它一定是星期五下午的啤酒车:)。应该在主体中。 – karakfa