【问题标题】:Cygwin Awk Split file into multiple files and saving with proper file namesCygwin Awk 将文件拆分为多个文件并使用正确的文件名保存
【发布时间】:2017-02-10 04:32:22
【问题描述】:

我已经进行了足够多的搜索,但没有什么对我有用。现在已经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

感谢您的宝贵时间。

【问题讨论】:

    标签: awk split


    【解决方案1】:

    你只需要:

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

    或者如果你想用下划线替换文件名中的所有空格:

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

    如果您不使用 GNU awk,那么您可能需要在执行过程中关闭()输出文件以避免“打开的文件过多”错误。您在 cygwin 上,因此已经在使用 gawk,所以这对您来说不是问题,只是对于可能阅读本文但未使用 gawk 的其他人(get 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2019-08-06
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      相关资源
      最近更新 更多