Cygwin Awk将文件拆分为多个文件并使用正确的文件名保存

时间:2017-02-09 17:11:55

标签: awk split multiple-files

我搜索得足够多,对我没用。现在已经2天了,我不得不问这个问题。我正在使用Awk和Cygwin。我的数据看起来像这样

Center Name,Account Number,Client Status
2001 - LA Center,xxxx,xxxx,xxxx,xxx
2001 - LA Center,xxxx,xxxx,xxxx,xxx
3005 - SD Center,xxxx,xxxx,xxxx,xxx
3005 - SD Center,xxxx,xxxx,xxxx,xxx

您可以猜到,我正在尝试根据第一列的中心名称将此文件分成多个文件。将标头复制到每个文件也很不错。预期产出:

Center Name,Account Number,Client Status
2001 - LA Center,xxxx,xxxx,xxxx,xxx
2001 - LA Center,xxxx,xxxx,xxxx,xxx

Center Name,Account Number,Client Status
3005 - SD Center,xxxx,xxxx,xxxx,xxx
3005 - SD Center,xxxx,xxxx,xxxx,xxx

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您只需要:

awk -F, '{print > $1}' file

或者如果要在文件名中用下划线替换所有空格:

awk -F, '{f=$1; gsub(/[[:space:]]+/,"_",f); print > f}' file

如果您没有使用GNU awk,那么您可能需要关闭()输出文件,以避免过多的打开文件"错误。你正在使用cygwin,所以已经使用了gawk,这对你来说不是问题,只是对于那些可能会阅读这个并且没有使用gawk的人(得到gawk!)。

哦,如果你想在所有输出文件中复制一个标题行,这可能会这样做(未经测试):

awk -F, 'NR==1{h=$0 ORS} {print h $0 > $1; h=""}' file

或者这可能是未经测试的,因为没有输入/输出来测试:

awk -F, 'NR==1{h=$0; next} !seen[$1]++{print h > $1} {print > $1}' file

OP在输入文件中有控制字符,这里有awk如何清理它们(以及为什么不用tr来尝试):

$ cat file
abc
def

$ cat -v file
a^@b^@c^M
d^@e^@f^M

$ tr -d '[:cntrl:]' < file | cat -v
abcdef$

$ awk '{gsub(/[[:cntrl:]]/,"")}1' file | cat -v
abc
def