web-dev-qa-db-ja.com

テキストファイルの行を個別のファイルに分割する

次のようなテキストファイルがあります。

foo
bar
Zip
rar
tar

OSXでbashスクリプトを使用して、次のような新しい行ごとに新しいテキストファイルを作成する必要があります。

cat text1.txt
foo
cat text2.txt
bar
cat text3.txt
Zip
cat text4.txt 
rar
cat text5.txt
tar
7
DisplayName

csplit を使用できます。これはうまく機能しますが、出力ファイル名に関しては柔軟性がなく(接尾辞ではなく接頭辞のみを指定できます)、個数を計算するには最初のパスが必要です。

csplit -f text -- input.txt '//' "{$(wc -l input.txt)}"
for x in text[0-9]*; do mv -- "$x" "$x.txt"; done

GNUバージョンですが、OSXバージョンではありません)には、両方の問題を解決する拡張機能があります。

csplit -b '%d.txt' -f text -- input.txt '//' '{*}'

または、csplitが柔軟性に欠ける場合は、awkを使用できます。

awk '{filename = sprintf("text%d.txt", NR); print >filename; close(filename)}' input.txt

純粋なbashのバージョン...

unset i; while read -r l; do echo $l > "text$((++i)).txt";done < text_file.txt
2
Miroslav Franc

テキストファイルの内容にスペースが含まれていない場合、Bashでforループを使用することもできます。

$ for x in $(<file.txt); do echo "$x" > text$((++i)).txt; done

$ cat file.txt 
foo
bar
Zip
rar
tar

$i未設定。

$ unset i
$ for x in $(<file.txt);do echo "$x" > text$((++i)).txt;done
$ ls -l text*
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text1.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text2.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text3.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text4.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text5.txt

結果の確認:

$ head text*
==> text1.txt <==
foo

==> text2.txt <==
bar

==> text3.txt <==
Zip

==> text4.txt <==
rar

==> text5.txt <==
tar
1
slm