次のテキストファイルがあります。
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
答え1
あなたはそれを使用することができます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
答え2
純粋なbashバージョン...
unset i; while read -r l; do echo $l > "text$((++i)).txt";done < text_file.txt
答え3
テキストファイルの内容にスペースが含まれていないと仮定すると、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