【问题标题】:awk: Split file using filenames different to the fieldawk:使用与字段不同的文件名拆分文件
【发布时间】:2017-03-10 23:23:57
【问题描述】:

我有一个非常大的 CSV 文件 input.csv,看起来像这样:

https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.56, 0.98, 87
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89

我正在尝试根据第一列中的 URL 将该文件的内容(所有列)保存到单独的文件中。

所以上面sn-p的输出应该是两个文件:

https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.56, 0.98, 87
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89

https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89

要根据第一列拆分此文件,我使用的是 awk:

awk -F, '{print >> ($1".csv")}' input.csv

但是,由于此错误,我无法根据 URL 字段保存到任何文件:

awk: cmd. line:1: (FILENAME=input.csv FNR=1) fatal: can't redirect to `    https://www.youtube.com/watch?v=9t5V_sMVN5I.csv' (No such file or directory)

使用 URL 样式的字符串作为文件名保存文件显然会导致一些错误。许多“/”一定是导致文件路径出现问题的原因。

有没有办法使用 awk 保存基于第 1 列 ($1) 的内容,但是这样的输出文件的命名不同,可能遵循编号 1..N 之类的序列?另一种选择是用一些唯一标识符替换每个 URL,然后对其进行拆分——但是我还不能编写脚本。

任何帮助将不胜感激!

【问题讨论】:

  • @Sundeep 完美!我不知道如何拆分嵌套在 awk 命令中的字符串。请将此添加为答案,以便我接受!

标签: bash csv awk


【解决方案1】:

由于第一列具有常规格式,= 后面的字符串作为唯一标识符,我们可以使用它

awk -F, '{split($1,a,"="); print > (a[2]".csv")}' input.csv

$ cat b7kKTSVbfdA.csv
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89

$ cat 9t5V_sMVN5I.csv
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.56, 0.98, 87
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89

参考:

【讨论】:

    【解决方案2】:

    因为你的文件名包含'/'字符,你可以用这个方法吹:

    awk -F, '{filename=$1;sub(".*=","",filename);print >> (filename".csv")}' input.csv   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 2020-06-22
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2012-07-11
      相关资源
      最近更新 更多