gpt4 book ai didi

linux - 根据列将文件拆分为多个文件的最有效方法

转载 作者:太空狗 更新时间:2023-10-29 11:25:00 25 4
gpt4 key购买 nike

一段时间以来,我一直在寻找一种有效地执行此操作的方法,但找不到最佳解决方案。

要求很简单。我有以下格式的文件。

$cat mymainfile
rec1,345,field3,....field20
rec1,645,field3,....field20
rec12,345,field3,....field20
frec23,45,field3,....field20
rec34,645,field3,....field20

在拆分操作结束时,我希望有多个具有这些名称的单独文件

$cat some_prefix_345_some_suffix_date
rec1,345,field3,....field20
rec12,345,field3,....field20

$cat some_prefix_645_some_suffix_date
rec1,645,field3,....field20
rec34,645,field3,....field20

$cat some_prefix_45_some_suffix_date
frec23,45,field3,....field20

我想过使用 grep,但它必须找到唯一的 ID,然后对每个 ID 进行 grep,因为在读取 mymainfile 之前我们不知道文件中的 ID(345,645 等) .

然后我想到了 csplit,例如这里 Split one file into multiple files based on delimiter但它根据分隔符而不是特定列进行拆分。

当谈到 bash 脚本时,我知道我可以使用 while 循环 逐行读取并拆分它,但不知道它是否有效。

我还想到了 awk 解决方案,例如 awk '$2 == ? { 等,但不知道如何获取这些不同的文件名。我可以使用 python 以编程方式执行此操作,但更喜欢单个命令行,而且我知道这是可能的。我厌倦了搜索,但仍然无法找到最佳方法。任何建议/最佳方法将不胜感激。

最佳答案

在 awk 中,您可以将每一行的输出重定向到您动态构建的名称不同的文件(在本例中基于 $2):

$ awk -F, '{print > ("some_prefix_" $2 "_some_suffix_date")}' file

$ ls *_date
some_prefix_345_some_suffix_date some_prefix_45_some_suffix_date some_prefix_645_some_suffix_date

$ cat some_prefix_345_some_suffix_date
rec1,345,field3,....field20
rec12,345,field3,....field20

$ cat some_prefix_645_some_suffix_date
rec1,645,field3,....field20
rec34,645,field3,....field20

$ cat some_prefix_45_some_suffix_date
frec23,45,field3,....field20

正如评论中所指出的,如果您有许多不同的 $2 值,并且打开文件过多时出现错误,您可以随时关闭:

 $ awk -F, '{fname = "xsome_prefix_" $2 "_some_suffix_date"
if (a[fname]++) print >> fname; else print > fname;
close fname}' file

关于linux - 根据列将文件拆分为多个文件的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53343938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com