0

タブで区切られたアーティスト名とその曲でいっぱいの 1 GB のファイルがあります。

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

そして、大きなファイルをアルファベット順に 26 個の小さなファイルに分割したいと考えています。

たとえば、artists_A.txt というファイルに A で始まるすべてのアーティスト、artists_B.txt というファイルに B で始まるすべてのアーティストが必要です。

sort コマンドと 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(",")コンマで分割します。また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 に答える