私はディレクトリ内のすべてのファイルを読み込み、条件付きチェックを実行し、レコード(行)の数に基づいていくつかのファイルを分割するシェルスクリプトを作成しています。
abc.txtファイルをabc(AAまたは01).txtに分割したいと思います。 (abcで始まり、.txtで終わる限り、何も構いません。)
これを行う簡単な方法はありますか?
分割コマンドを使用しています。
split -l $line_count $file $????
混乱しています。代わりに何を使うべきですか? ? ?
私も別のアプローチで開いていますが、残りのスクリプトはすでに準備されているので、???のみを変更することを好みます。
非常にありがとう
答え1
努力する:
split -l 5 --additional-suffix=.txt abc.txt abc
または文字の代わりに数字が必要な場合:
split -l 5 -d --additional-suffix=.txt abc.txt abc
abc
ファイル名の後に追加するプレフィックス。
オプションをサフィックスとして欲しいので、.txt
オプションを追加しました--additional-suffix=.txt
。
オプションは、文字の代わりに数字を使用することを-d
示します。split
はい
ファイルを含むディレクトリから始めましょう。
$ ls
abc.txt
それではファイルを分割してみましょう。
$ split -l 5 -d --additional-suffix=.txt abc.txt abc
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt
解決策 1: シェルの使用
GNUパーティションの現在のバージョンはこの--additional-suffix
オプションをサポートしており、split
GNU coreutilsの一部です。これは、最終的にこのオプションをすべてのLinuxシステムで使用できることを意味します。
split
現在のファイルが不足しているシステムの場合、回避策はファイルの作成後にファイルの名前を変更することです。たとえば、
$ split -l 5 -d abc.txt abc
$ for f in ./abc??; do mv "$f" "$f.txt"; done
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt
上記では、デフォルトのサフィックス長2が適用されたと仮定します。それ以外の場合は、?
使用しているサフィックスの長さに合わせて数字を変更してください。たとえば、サフィックス長5を使用する場合:
$ split -l 5 -a 5 -d abc.txt abc
$ for f in ./abc?????; do mv "$f" "$f.txt"; done
$ ls
abc00000.txt abc00001.txt abc00002.txt abc00003.txt abc.txt
解決策2:awkの使用
ここで、オプションはl
各分割ファイルに含まれる行数を指定し、d
分割ファイル名に使用されるビット数を指定します。d
十分大きいことを確認してください。
$ awk -v l=5 -v d=2 '{n="0000" int((NR-1)/l); f="abc" substr(n,length(n)+1-d) ".txt"; if (f!=old) close(old); old=f; print >f}' abc.txt
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt