awk继续运行旧文件而不是新文件

时间:2015-10-08 18:11:37

标签: memory awk cygwin

 awk 'NR==1 {n=$2} {; file =sprintf("chr1_50kb_%.5d", ($2-n)/50000); if (file !=last_file) {; close(last_file); last_file = file;}; print > file;}' file2

我正在Windows 7上运行cygwin。我在文件1上运行此oneliner并尝试为file2运行它,但结果仍然是给我文件1而不是file2的结果。文件1和文件2位于不同的文件夹中,长度约为500k行。

我该如何解决这个问题?

file1的第一行

chr19 3000118 + 0 0 0 0
chr19 3000119 - 0 0 0 0
chr19 3000315 + 0 0 0 0
chr19 3000316 - 0 0 0 0
chr19 3000602 + 0 0 0 0
chr19 3000603 - 0 0 0 0
chr19 3000718 + 0 0 0 0
chr19 3000719 - 0 0 0 0
chr19 3000720 + 0 0 0 0
chr19 3000721 - 0 0 0 0

file2的第一行

chr1 3000573 + 0 0 1 0 1 0
chr1 3000574 - 0 0 0 0 0 0
chr1 3000725 + 1 0 1 0 2 0
chr1 3000726 - 0 0 0 0 0 0
chr1 3000900 + 1 1 0 1 1 2
chr1 3000901 - 0 0 0 0 0 0
chr1 3001345 + 1 0 1 0 2 0
chr1 3001346 - 1 0 0 0 1 0
chr1 3001393 + 0 0 0 0 0 0
chr1 3001394 - 2 0 1 0 3 0

好像是文件1和2中$ 2重叠的结果,因为最后创建的文件(没有重叠的$ 2的数字)具有我正在寻找的结果。

1 个答案:

答案 0 :(得分:0)

根据reference manual,">" print redirect将删除输出文件的先前内容。请注意,file1和file2都将尝试重定向到相同的输出文件名($ 2在同一个50000数字块中)。为避免以这种方式丢失您的任何输入,我建议您更改">"到">>"相反,它将附加到任何现有文件。在这种情况下,您可能需要在运行之间删除(或清空)输出文件。

再看一下,也许你应该在文件名中编码1美元?除非你希望那些chr19记录进入名为chr1 _...。

的文件中