ファイルを行ごとに分割し、結果のファイル拡張子を制御する


28

ファイル分割の標準コマンド-splitがあります。

たとえば、単語ファイルを10000行の複数のチャンクに分割する場合、次を使用できます。

split -dl 10000 words wrd

そして、wrd.01、wrd.02などの形式の複数のファイルを生成します。

しかし、これらのファイルには特定の拡張子が必要です。たとえば、wtd.01.txt、wrd.02.txtファイルを取得したいです。

それを行う方法はありますか?

回答:


11

ではなく、split後で簡単に名前を変更するか、次のように変更できますawk

awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile

よさそうだ-しかし、動作しません。フォームで、「>>リダイレクトの式にヌル文字列値がある」ことについて文句を言い、「file」が「filename」に「変更」されると、wrd。{file number}。{line number}の形式のファイルを出力します。 .txt(非常に多く:)
Rogach

@Rogach申し訳ありませんが、テストしていなかったため、awkが整数除算を行わないことを忘れていました。これをテストしました。
ケビン

49

これは当時は使用できませんでしたが、最新バージョン(≥ 8.16gnu splitでは--additional-suffixスイッチを使用して、結果の拡張機能を制御できます。からman split

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.

そのため、そのオプションを使用する場合:

split -dl 10000 --additional-suffix=.txt words wrd

結果の断片は自動的に終了し.txtます:

wrd00.txt
wrd01.txt
.........

3
Macで動作しない
エリグ

2
あなたの皮肉が大好きです。私は、Appleの世界のUnix n00bです。私はOS X Yosemiteを使用していますが、他の人がクラッシュしたり燃やしたりしたくないだけです。私はドキュメントでテストとレビューを行いましたが、このパラメーターはありません。私は何かを見逃したかもしれません。developer.apple.com/library/mac/documentation/Darwin/Reference/…–
ericgu

5
@swiftshokunin-私の答えはgnu split、の一部に関するものですgnu coreutils。OSXでもインストールできますcoreutils経由でhomebrewはなく、ノートデフォルトでは、OSX上で、というgnuユーティリティがしているg(例えば自分の名前の前に追加gstatの代わりstat)としてそれボークますのでgsplit(またはガイドに従ってPATHを変更し、ここであなたがしたい場合splitOSX上で使用する場合split)。HTH。
-don_crissti

1
いい答えだ。OS Xでは、使用gsplitして数値のサフィックス(-d)を取得します。
ブレントファウスト

1
うわー、私はgsplitがあることを知りませんでした-それはおそらく上記のcoreutilsからのものであり、-additional-suffixを持っています。このソリューションのコメントみんなのおかげで:)
ルカシュRysiak

13

このようなタスクは、シェルで管理するのが最適です。splitを使用し、単純なループを作成してファイルの名前を変更します。例えば

for file in wrd.*
do
    mv "$file" "$file.txt"
done

wrd.01、wrd.02などのファイルの名前を変更して、すべての拡張子が.txtになるようにします。


それは非常に明白ですが、bashスクリプトの簡潔さを損ないます。
-Rogach

1
Unixの哲学は、一連のシンプルなツールを提供し、それを組み合わせて仕事をすることです。「bashスクリプトの簡潔さ」は、あなたの質問に明記された要件ではありませんでした。
カイルジョーンズ

7
PS:split+mvコンボは1000万行の入力ファイル(75 MB)の場合(約3 18秒より6倍以上高速です...各行のテキストは独自の行番号でした... 「明白な」:)awk
Peter.O

3
PPS:これについてもう少し調べています。速度の違いは、出力ファイルの数に関係なく、awkが行ごとに行うフォーマットと算術計算の数に対する作成されたファイルの数に関連しています...上記の例と同じ入力ファイルを使用する場合:100倍少ないファイル、split + mvである75倍速くよりawk:存在する場合には100倍以上のファイルが、split + mvある1.5倍速くよりawk。だから、私にとっては、このsplit + mv方法が勝ちです。それは簡潔なものであり(ほぼ間違いなく)、よりも高速ですawk
Peter.O

1
5行の長さを心配している場合は、代わりにこれを試してください。for file in wrd.*; do mv "$file" "$file.txt"; done:)
トニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.