如何将一个 csv 列转换为 n 个包含相等行且每个文件包含标题作为 id 的 csv 文件?
Posted
技术标签:
【中文标题】如何将一个 csv 列转换为 n 个包含相等行且每个文件包含标题作为 id 的 csv 文件?【英文标题】:How to convert one csv column into n csv files which contain equal rows and each file contains header as id? 【发布时间】: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 整除吗?如果不应该发生,即如何决定每个文件应该有多少行? 【参考方案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
,其中N
是int(NR/2)
文件号。
当我们从一个文件切换到另一个文件时,我们必须关闭前一个文件,否则如果输入很长,Awk 进程可能会达到打开文件数的限制。
换成新文件的时候,也要记得先把id
的数字打印进去。
【讨论】:
以上是关于如何将一个 csv 列转换为 n 个包含相等行且每个文件包含标题作为 id 的 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何将同时具有逗号和空格分隔符的 CSV 文件转换为只有空格分隔符的 csv