我搜索得足够多,对我没用。现在已经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
感谢您的时间。
答案 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