Разделите строки текстового файла в отдельные файлы

Заключение в кавычки только требовалось бы если {} интерпретировался оболочкой. Никакая современная оболочка (что я знаю) не интерпретирует {} любой путь кроме буквально. В bash и ksh93, {} указывает на расширение фигурной скобки, но с тех пор {} пустое расширение фигурной скобки, оно не интерпретируется. В оболочке POSIX это не имеет никакого значения и является также литеральным - также. Я не знаю, что он имеет любое особое значение в исходной Оболочке Bourne, также.

Скорее всего, это заключение в кавычки является просто людьми, являющимися осторожным, и принятие { или } (или эти объединенные два), может быть интерпретирован как метасимволы определенными оболочками. В практике я не могу думать ни о каких оболочках, которые присваивают особое значение ей.

7
30.10.2014, 03:08
3 ответа

Вы можете использовать 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
8
27.01.2020, 20:16

Предполагая, что содержимое текстового файла не содержит пробелов, которые вы также можете использовать A для цикла в Bash.

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

Пример

$ cat file.txt 
foo
bar
zip
rar
tar

Теперь с $ I unset.

$ 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
27.01.2020, 20:16

Версия с чистым басом...

unset i; while read -r l; do echo $l > "text$((++i)).txt";done < text_file.txt
2
27.01.2020, 20:16

Теги

Похожие вопросы