一个文件data.csv
有以下数据
1,avocado,mexican green fruit
1,kiwi,green fruit
1,banana,yellow fruit
1,mango,yellow fruit
要将数据组织成水果类别,我已经完成了
awk -F ',' '{print >> ($3 ".csv")}' data.csv
它创建了 3 个文件,mexican green fruit.csv
, green fruit.csv
,yellow fruit.csv
我希望将这些文件名称中的空格替换为下划线_
所以,文件名应该是mexican_green_fruit.csv
, green_fruit.csv
,yellow_fruit.csv
在这一班轮中需要帮助awk
才能做到这一点
寻找awk
唯一的答案
GNU awk 的仅 awk 答案(如 OP 所要求的)将是:
如果您的输入足够小以至于您不能超过“打开的文件过多”阈值,则任何 POSIX awk 的仅 awk 答案将是:
如果您可能超过“打开的文件过多”阈值,则任何 POSIX awk 的仅 awk 答案将是:
但是最后一个会很慢,因为它会关闭并重新打开每次写入的输出文件,并且它假设您可以将每个
$3
值存储在内存中。您可以通过仅在输出文件更改时关闭输出文件来提高效率:如果您对不是 awk-only 的答案感到满意,那么使用任何 POSIX awk、排序和剪切的 DSU(装饰/排序/取消装饰)习语,以下内容对于任何大小的输入文件都将有效且稳健地工作可以
sort
处理(并且它被设计为使用按需分页等来处理非常大的文件),并且对于任意数量的输出文件:有关 DSU 的更多信息,请参阅https://stackoverflow.com/questions/71691113/how-to-sort-data-based-on-the-value-of-a-column-for-part-multiple-lines-of- af/71694367#71694367。
可以用一个函数来完成,例如:
在这里用
_
.(使用 gnu awk 或类似的)你可以运行一些东西
gensub
是一个功能性的sub
——稍微容易编写。>
可能比>>
除非您在执行此命令之前创建了一些 csv 更好。编辑:应对新要求(实际上是一个新问题)