如何使用 awk(或其他命令行工具)将一个 CSV 文件拆分为多个 txt 文件?

How to split a CSV file into multiple txt files using awk (or other command line tool)?

我有一个如下所示的 CSV 文件:

1,apple
2,orange
3,orange
4,pear
5,banana

CSV 文件有数千行。

现在我想将其拆分成数千个单独的 .txt 文件。

每个 .txt 文件应以逗号前的数字命名,.txt 文件的内容应包含逗号后的单词,如下所示:

1.txt  contains: apple
2.txt  contains: orange
3.txt  contains: orange
4.txt  contains: pear
5.txt  contains: banana

等等。

有一个 询问如何使用 bash 脚本执行此操作,但我想使用命令行(awk 或类似的)来执行此操作,并且该问题的当前答案使用awk 无法正常工作。

使用这个awk你可以获得五个文件:

awk -F, '/^[[:digit:]]+/ {close(output); output=} {=".txt";=" contains: " ;print > output}' file
  • 每个文件的内容和名称:
$ cat 1                                                                        
1.txt  contains: apple
$ cat 2
2.txt  contains: orange
$ cat 3
3.txt  contains: orange
$ cat 4
4.txt  contains: pear
$ cat 5
5.txt  contains: banana

您可以看到这些帖子:

print  >  ".txt"

是根据 POSIX awk 未定义的行为,因此不同的 AWK 对 print > a b 的行为做出不同的选择。

您应该像这样在重定向运算符之后将字符串连接分组在单个表达式中:

awk -F, '{print  > ( ".txt")}' file.csv

我相信这是因为 > 运算符优先于 sting 连接,因此使 > 成为一个命令,然后将 .txt 视为语法错误。


在非 gnu AWK 上,> 运算符每次都会打开一个新文件,如果输入多于几行,awk 将由于打开文件句柄的限制而开始抛出错误。您应该在每次使用后使用此命令关闭文件句柄:

awk -F, '{fn =  ".txt"; print  > fn; close(fn)}' file.csv