【问题标题】:How to convert one csv column into n csv files which contain equal rows and each file contains header as id?如何将一个 csv 列转换为 n 个包含相等行且每个文件包含标题作为 id 的 csv 文件?
【发布时间】:2021-11-08 15:50:55
【问题描述】:

我有一个 CSV 文件,其中只包含一列,例如

file.csv
id
c108258e-7feb-46f3-a225-b35bde591463
c4f5bbd3-8576-4201-b297-23b25ff82295
cfcfb84a-0525-4590-b428-fef177172030
9736f570-d1d9-4701-a2c4-6644b0570b4e
e45647a9-fe22-446b-a1c6-5870144d60cc
1782d947-a95c-4817-b809-152bdbf6574d

我想将其转换为 3 个 CSV 文件,每个文件中都包含 id 作为标题。

file1.csv
id
c108258e-7feb-46f3-a225-b35bde591463
c4f5bbd3-8576-4201-b297-23b25ff82295

 
file2.csv
id
cfcfb84a-0525-4590-b428-fef177172030
9736f570-d1d9-4701-a2c4-6644b0570b4e


file3.csv
id
e45647a9-fe22-446b-a1c6-5870144d60cc
1782d947-a95c-4817-b809-152bdbf6574d

请仅使用 awk 或 sed 而非 jq 解决此问题?

【问题讨论】:

  • 想把它转换成 4 个 CSV 文件 那为什么你想要的输出只显示 3 个文件呢?输入中的行数总是可以被 4 整除吗?如果不应该发生,即如何决定每个文件应该有多少行?

标签: unix awk sed


【解决方案1】:

awk 代码:

NR == 1 { id = $0 }
NR > 1 { file = "file-" int(NR / 2)
         if (old_file != file)
         { close(old_file);
           old_file = file;
           print id > file }
         print $0 > file }

awk 中的记录是从 1 开始编号的。如果第一条记录是一个 ID,并且我们想将后续的记录对分配给连续的自然数,我们只需将记录号除以 2,然后截断为整数:@ 987654322@ 将记录 2 和 3 映射到 1,将 4 和 5 映射到 2,依此类推。

我们从第一个记录中收集id,然后对于所有后续记录,我们将记录写入file-N,其中Nint(NR/2) 文件号。

当我们从一个文件切换到另一个文件时,我们必须关闭前一个文件,否则如果输入很长,Awk 进程可能会达到打开文件数的限制。

换成新文件的时候,也要记得先把id的数字打印进去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多