0

我有一个 1GB 的文件,里面满是艺术家的名字,他们的歌曲用制表符分隔。

Artist1    Song1    Song2    Song3 ...
Artist2    Song1    Song2    Song3 ...

我想按字母顺序将大文件拆分为 26 个不同的小文件。

例如,我希望所有以 A 开头的艺术家都在一个名为 Artists_A.txt 的文件中,所有以 B 开头的艺术家都在一个名为 Artists_B.txt 的文件中,等等。

我知道 sort 和 split 命令,但是有没有办法利用 split 命令在某些条件下进行拆分?另外,如果有更简单的方法,我宁愿不要单独阅读每一行并将其放入正确的文件中。

另外,好奇是否有办法在 Python 中做到这一点。

编辑:我认为 csplit 可能是我问题的答案。

编辑: AWK 是使用空格分隔数据时要使用的程序!:)

4

3 回答 3

2
awk '{ print >> "artists_"toupper(substr($1, 1, 1))".txt" }' < songs.txt
于 2013-08-30T03:21:06.247 回答
0

我知道 sort 和 split 命令,但是有没有办法利用 split 命令在某些条件下进行拆分?

是的,split()采用可选的分隔符参数。例如,split(",")用逗号分隔。还有splitlines(),它处理跨平台分割线的混乱。

另外,如果有更简单的方法,我宁愿不要单独阅读每一行并将其放入正确的文件中。

我总是建议不要在任何代码中打开多个文件对象。这是灾难的秘诀。

另外,好奇是否有办法在 Python 中做到这一点。

试试这个。

# Read input file
with open("artists.txt") as in_file:
    artists = in_file.read().splitlines()

# Make the data structure you want
artists_sorted = {letter: [] for letter in "abcdefghijklmnopqrstuvwxyz"}
for artist in artists:
    artists_sorted[artist[0].lower()].append(artist)

# Write output files
for letter, value in artists_sorted.iteritems():
    with open("artists_%s.txt" % letter.upper(), "w") as out_file:
        out_file.write("\n".join(value))
于 2013-08-30T03:25:54.290 回答
0

如果您尝试使用 Mac OSX 版本的 awk 执行此操作,您可能会遇到错误。(我做到了!)

试试这个,它不是那么花哨,但它有效:

awk '{x = toupper(substr($1,1,1)); filename = "artists_" x ".txt"; print >>filename; close filename}' < songs.txt

close filename

bit 可以防止“打开的文件太多”错误。

于 2016-01-14T19:44:06.340 回答