我有一个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是使用空格分隔数据时要使用的程序! :)
答案 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;错误。