Мой файл temp.txt выглядит следующим образом:
00ABC
PQR123400
00XYZ001234
012345
0012233
Я хочу разделить файл на основе шаблона '\r\n00'. В этом случае temp.txt должен быть разделен на 3 файла.
first.txt:
00ABC
PQR123400
second.txt
00XYZ001234
012345
third.txt
0012233
Я пытаюсь использовать csplit для соответствия шаблону '\r\n00', но отладка показывает мне недопустимый шаблон. Может кто-нибудь, пожалуйста, помогите мне сопоставить точный шаблон, используя csplit
С показанными образцами попробуйте следовать коду awk
. Написано и протестировано в GNU awk
.
Этот код создаст в вашей системе файлы с такими именами, как: 1.txt
, 2.txt
и так далее. Это также позаботится о закрытии выходных файлов в бэкэнде, чтобы мы не получили печально известную ошибку too many files opened
one.
awk -v RS='\r?\n00' -v count = "1" '
{
outputFile=(count++".txt")
rt=RT
sub(/\r?\n/,"",rt)
if (!rt){
sub(/\n+/,"")
rt=prevRT
}
printf("%s%s\n",(count>2?rt:""),$0) > outputFile
close(outputFile)
prevRT=rt
}
' Input_file
Объяснение: Добавлено подробное объяснение приведенного выше кода.
awk -v RS='\r?\n00' -v count = "1" ' ##Starting awk program from here and setting RS as \r?\n00 aong with that setting count as 1 here.
{
outputFile=(count++".txt") ##Creating outputFile which has value of count(increases each time cursor comes here) followed by .txt here.
rt=RT ##Setting RT value to rt here.
sub(/\r?\n/,"",rt) ##Substituting \r?\n with NULL in rt.
if (!rt){ ##If rt is NULL then do following.
sub(/\n+/,"") ##Substituting new lines 1 or more with NULL.
rt=prevRT ##Setting preRT to rt here.
}
printf("%s%s\n",(count>2?rt:""),$0) > outputFile ##Printing rt and current line into outputFile.
close(outputFile) ##Closing outputFile in backend.
prevRT=rt ##Setting rt to prevRT here.
}
' Input_file ##Mentioning Input_file name here.
Извините, я новичок в оболочке korn и не знаю, как встроить это в мою программу оболочки korn.
@Хейн, привет, не беспокойся. Вы можете скопировать и вставить мою программу и изменить только Input_file
на свой фактический файл, затем запустить его на самом терминале, попробовать, а затем мы посмотрим, как оно пойдет, ура.
да, это работает, спасибо :) но как мне вставить это в файл ksh? плюс мне нужно сделать больше с точки зрения установки динамического имени файла, которое я хочу извлечь из строк в файле, начинающихся с шаблона '\ r \ n00', также проверьте, существует ли файл, а затем добавьте к существующему файлу или создайте новый файл.
Я могу извлечь динамическое имя файла, но разбивая часть, которую вы дали, я пытался встроить в свою программу ksh, но это не работает.
@Hane, для запуска этого кода в сценарии оболочки #!/bin/ksh
в верхней части файла и скопируйте и вставьте в него весь код (обязательно измените имя Input_file на ваше фактическое имя файла) и предоставьте соответствующие разрешения вашему сценарию (пример script.ksh
), а затем запустите это, это должно работать тогда. Я бы сказал, что для ваших новых 2 вопросов вы можете добавить новый пост/вопрос здесь.
каким-то образом код добавляет дополнительные «00» в начало первой записи в файле
@Hane, конечно, я исправил эту проблему, пожалуйста, проверьте ее один раз и дайте мне знать, как дела, ура.
Теперь первая запись в первом файле выглядит нормально, но остальные файлы убрали «00» из своей первой записи. например, первая запись 0000111, 2-я запись 0000112. С более ранним кодом 1-я запись стала 000000111. с новым кодом 2-я запись стала 00112
@Hane, извините, но для меня этот код сработал нормально, и во втором файле с именем 2.txt
есть первая строка, например 00XYZ001234
, а в третьем файле 3.txt есть первая строка, например 0012233
. Что выглядит хорошо для меня в соответствии с показанными вами образцами, пожалуйста, дайте мне знать о том же.
Просто изменил условие printf("%s%s\n",(count>=2?rt:""),$0) и вроде работает. Проверим еще и сообщим. Большое спасибо за всю помощь!
@Хейн, удачи и счастливого обучения.
@Hane, только один запрос, обнови свою неудачную команду csplit
в своем вопросе, даже если она не сработала, это нормально, поэтому, если какой-либо пользователь ищет это в Google, он должен получить от этого пользу, ура.
Перво-наперво СПАСИБО за хороший и ясный вопрос, так держать. Для
I am trying to use csplit to match pattern '\r\n00'
Хорошо, что вы упомянули о своих усилиях, пожалуйста, также укажите их в виде кода в своем вопросе, ура.