awk命令不会在windows上停止合并大型csv文件

awk命令不会在windows上停止合并大型csv文件,windows,csv,awk,Windows,Csv,Awk,我正在Windows 10上执行以下awk命令 awk "(NR == 1) || (FNR > 1)" *.csv > bigMergeFile.csv 我想只使用第一个文件的头将所有csv文件合并到一个名为bigMergeFile.csv的文件中 我在小文件(4个文件,每个文件包含5个col和4行)上成功地测试了代码。但是,当我在大文件(10个文件,每个文件有8k行,32k列,大约1GB大小)上运行代码时,代码不会停止。它仅在硬盘空间用完时停止执行。此时,结

我正在Windows 10上执行以下awk命令

awk "(NR == 1) || (FNR > 1)" *.csv > bigMergeFile.csv
我想只使用第一个文件的头将所有csv文件合并到一个名为bigMergeFile.csv的文件中

我在小文件(4个文件,每个文件包含5个col和4行)上成功地测试了代码。但是,当我在大文件(10个文件,每个文件有8k行,32k列,大约1GB大小)上运行代码时,代码不会停止。它仅在硬盘空间用完时停止执行。此时,结果输出文件bigMergeFile.csv的大小为30GB。所有输入csv文件的合并文件大小为9.5 GB


我已经在Mac OS上测试了代码,效果很好。帮助将不胜感激。

我的猜测:bigMergeFile.csv以.csv结尾,因此它是脚本运行时使用的输入文件之一,并且随着脚本的附加而不断增长。就像你写了一个循环一样:

while ! end-of-file do
    read line from start of file
    write line to end of file
done
     

因为你基本上是在做一个concat而不是一个merge,所以将FS=“^$”设置为它不会浪费时间尝试分割你无论如何都不需要的字段。

(与你面临的问题无关)我建议使用
head-n1 sample.csv;tail-qn+2*.csv
而不是
awk
谢谢您指出这一点。我更改了输出文件的扩展名,它工作了。只是出于好奇,为什么它能在Mac OS而不是Windows上工作是无法理解的:)这并不是无法理解的,显然,在不同的平台上,对正在阅读的同一文件进行写入的处理方式不同(假设你确实在Mac上也将输出文件作为输入文件之一)。经验法则-永远不要那样做!