Разделение файла на основе шаблона '\r\n00' в оболочке korn

Мой файл 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

Перво-наперво СПАСИБО за хороший и ясный вопрос, так держать. Для I am trying to use csplit to match pattern '\r\n00' Хорошо, что вы упомянули о своих усилиях, пожалуйста, также укажите их в виде кода в своем вопросе, ура.

RavinderSingh13 21.03.2022 19:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С показанными образцами попробуйте следовать коду 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.

Hane 22.03.2022 07:24

@Хейн, привет, не беспокойся. Вы можете скопировать и вставить мою программу и изменить только Input_file на свой фактический файл, затем запустить его на самом терминале, попробовать, а затем мы посмотрим, как оно пойдет, ура.

RavinderSingh13 22.03.2022 07:25

да, это работает, спасибо :) но как мне вставить это в файл ksh? плюс мне нужно сделать больше с точки зрения установки динамического имени файла, которое я хочу извлечь из строк в файле, начинающихся с шаблона '\ r \ n00', также проверьте, существует ли файл, а затем добавьте к существующему файлу или создайте новый файл.

Hane 22.03.2022 08:09

Я могу извлечь динамическое имя файла, но разбивая часть, которую вы дали, я пытался встроить в свою программу ksh, но это не работает.

Hane 22.03.2022 08:10

@Hane, для запуска этого кода в сценарии оболочки #!/bin/ksh в верхней части файла и скопируйте и вставьте в него весь код (обязательно измените имя Input_file на ваше фактическое имя файла) и предоставьте соответствующие разрешения вашему сценарию (пример script.ksh), а затем запустите это, это должно работать тогда. Я бы сказал, что для ваших новых 2 вопросов вы можете добавить новый пост/вопрос здесь.

RavinderSingh13 22.03.2022 08:11

каким-то образом код добавляет дополнительные «00» в начало первой записи в файле

Hane 22.03.2022 15:15

@Hane, конечно, я исправил эту проблему, пожалуйста, проверьте ее один раз и дайте мне знать, как дела, ура.

RavinderSingh13 22.03.2022 15:19

Теперь первая запись в первом файле выглядит нормально, но остальные файлы убрали «00» из своей первой записи. например, первая запись 0000111, 2-я запись 0000112. С более ранним кодом 1-я запись стала 000000111. с новым кодом 2-я запись стала 00112

Hane 22.03.2022 15:30

@Hane, извините, но для меня этот код сработал нормально, и во втором файле с именем 2.txt есть первая строка, например 00XYZ001234, а в третьем файле 3.txt есть первая строка, например 0012233. Что выглядит хорошо для меня в соответствии с показанными вами образцами, пожалуйста, дайте мне знать о том же.

RavinderSingh13 22.03.2022 15:35

Просто изменил условие printf("%s%s\n",(count>=2?rt:""),$0) и вроде работает. Проверим еще и сообщим. Большое спасибо за всю помощь!

Hane 22.03.2022 15:53

@Хейн, удачи и счастливого обучения.

RavinderSingh13 22.03.2022 15:59

@Hane, только один запрос, обнови свою неудачную команду csplit в своем вопросе, даже если она не сработала, это нормально, поэтому, если какой-либо пользователь ищет это в Google, он должен получить от этого пользу, ура.

RavinderSingh13 22.03.2022 16:04

Другие вопросы по теме