РЕДАКТИРОВАТЬ2 Поговорили с OP в разделе комментариев и OP упомянули, что если любая строка начинается с каких-либо алфавитов или цифр, она должна идти к соответствующей букве, иначе она должна идти в другой файл,тогда следует попробовать следующее.
awk '{if($0 ~ /^[a-zA-Z0-9]/){file=substr($0, 1, 1)} else {file="symbol_file"};print >> (file);close(file)}' Input_file
ИЛИ В соответствии с комментарием Эда сэра сократить форму выше решения.
awk '{file = (/^[[:alnum:]]/ ? tolower(substr($0,1,1)) : "symbol") ".txt"; print >> file; close(file)}' Input_file
РЕДАКТИРОВАТЬ1:
awk '{if($0~/^\\/ || $0~/^\//){file="symbol_file"} else {file=substr($0, 1, 1)};print >> (file);close(file)}' Input_file
Не могли бы вы попробовать один раз.
awk '{if($0~/^\\/){file=substr($0, 2, 1)} else {file=substr($0, 1, 1)};print >> (file);close(file)}' Input_file
Добавлены исправления подхода OP и другие предложения:
1 - Вы не закрывали выходные файлы в бэк-энде, что, безусловно, будет проблематично, если у вас огромный Input_file ив результате появится сообщение «Ошибка слишком большого количества открытых файлов»;поэтому я исправил это.
2- Вы используете substr($0, 0, 1)
, что не должно быть так;в substr index starts from
1 not from
0`.
3- К вашему вопросу о строках, начинающихся с \
Я проверил условие для этого, если строка начинается с \
, тогда взять 2-й символдля выходного файла или взять первый символ для имени выходного файла.