如何按字母顺序将大文件拆分成较小的文件?

时间:2013-08-30 03:04:24

标签: python unix split

我有一个1GB的文件,其中包含艺术家名称和由标签分隔的歌曲。

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

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

e.g。我希望所有以A开头的艺术家都在一个名为artists_A.txt的文件中,所有以B开头的艺术家都在名为artists_B.txt的文件中等。

我知道sort和split命令,但有没有办法在某些条件下控制split命令?此外,如果有更简单的方法,我宁愿不单独阅读每一行并将其放在正确的文件中。

另外,好奇是否有办法在Python中执行此操作。

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

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

3 个答案:

答案 0 :(得分:2)

awk '{ print >> "artists_"toupper(substr($1, 1, 1))".txt" }' < songs.txt

答案 1 :(得分: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))

答案 2 :(得分:0)

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

试试这个,它并不像花哨但它有效:

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

close filename

位可以阻止过多的打开文件&#34;错误。