将文本文件的行拆分为单独的文件

将文本文件的行拆分为单独的文件

我有一个看起来像这样的文本文件:

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

相关内容