Как удалить определенные данные из начала файла схемы json / avro и последнюю скобку из конца файла? - PullRequest
0 голосов
/ 11 апреля 2019

Я извлекаю схему таблицы из БД-оракула, используя Apache Nifi, который мне нужно использовать для создания таблицы в BigQuery. Обработчик экстракта SQL в NiFi предоставляет мне файл схемы, который я сохраняю в своем домашнем каталоге. Теперь, чтобы использовать этот файл схемы в BigQuery, мне нужно удалить определенную часть файла схемы из начала и конца. Как мне сделать это в Unix, используя sed / awk?

Вот содержимое выходного файла:

Obj^A^D^Vavro.schema<88>^L{"type":"record","name":"NiFi_ExecuteSQL_Record","namespace":"any.data","fields":[{"name":"FEED_SEQUENCE","type":["null",{"type":"bytes","logicalType":"decimal","precision":38,"scale":0}]},{"name":"FEED_UNIQUE_NAME","type":["null","string"]},{"name":"COUNTRY_CODE","type":["null","string"]},{"name":"EXTRACTION_TYPE","type":["null","string"]},{"name":"PROJECT_SEQUENCE","type":["null",{"type":"bytes","logicalType":"decimal","precision":38,"scale":0}]},{"name":"CREATED_BY","type":["null","string"]},{"name":"CREATED_DATE","type":["null",{"type":"long","logicalType":"timestamp-millis"}]},{"name":"UPDATED_BY","type":["null","string"]},{"name":"UPDATED_DATE","type":["null",{"type":"long","logicalType":"timestamp-millis"}]},{"name":"FEED_DESC","type":["null","string"]}]}^Tavro.codec^Hnull^@àÂ<87>)[ù<8b><97><90>"õ^S<98>[<98>±

Я хочу удалить Начальную часть Obj^A^D^Vavro.schema<88>^L{"type":"record","name":"NiFi_ExecuteSQL_Record","namespace":"any.data","fields": и конечная часть }^Tavro.codec^Hnull^@àÂ<87>)[ù<8b><97><90>"õ^S<98>[<98>± сверху.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Вы можете использовать ExtractAvroMetadata процессор для извлечения только avro.schema из avro flowfile.

  • В процессоредля свойства Metadata Keys укажите значение avro.schema, затем процессор извлечет метаданные avro и сохранит их в качестве атрибута потокового файла.

  • Используйте значение атрибута (${avro.schema} in ReplaceText процессор для перезаписи содержимого потокового файла и создания таблицы.

1 голос
/ 11 апреля 2019

Учитывая, что Вы хотите удалить все снаружи, сначала [и последний]:

sed 's/^[^[]*//;s/[^]]*$//'

Тест:

$ cat out.file
Obj^A^D^Vavro.schema<88>^L{"type":"record","name":"NiFi_ExecuteSQL_Record","namespace":"any.data","fields":[{"name":"FEED_SEQUENCE","type":["null",{"type":"bytes","logicalType":"decimal","precision":38,"scale":0}]},{"name":"FEED_UNIQUE_NAME","type":["null","string"]},{"name":"COUNTRY_CODE","type":["null","string"]},{"name":"EXTRACTION_TYPE","type":["null","string"]},{"name":"PROJECT_SEQUENCE","type":["null",{"type":"bytes","logicalType":"decimal","precision":38,"scale":0}]},{"name":"CREATED_BY","type":["null","string"]},{"name":"CREATED_DATE","type":["null",{"type":"long","logicalType":"timestamp-millis"}]},{"name":"UPDATED_BY","type":["null","string"]},{"name":"UPDATED_DATE","type":["null",{"type":"long","logicalType":"timestamp-millis"}]},{"name":"FEED_DESC","type":["null","string"]}]}^Tavro.codec^Hnull^@àÂ<87>)[ù<8b><97><90>"õ^S<98>[<98>±
$ sed 's/^[^[]*//;s/[^]]*$//' out.file
[{"name":"FEED_SEQUENCE","type":["null",{"type":"bytes","logicalType":"decimal","precision":38,"scale":0}]},{"name":"FEED_UNIQUE_NAME","type":["null","string"]},{"name":"COUNTRY_CODE","type":["null","string"]},{"name":"EXTRACTION_TYPE","type":["null","string"]},{"name":"PROJECT_SEQUENCE","type":["null",{"type":"bytes","logicalType":"decimal","precision":38,"scale":0}]},{"name":"CREATED_BY","type":["null","string"]},{"name":"CREATED_DATE","type":["null",{"type":"long","logicalType":"timestamp-millis"}]},{"name":"UPDATED_BY","type":["null","string"]},{"name":"UPDATED_DATE","type":["null",{"type":"long","logicalType":"timestamp-millis"}]},{"name":"FEED_DESC","type":["null","string"]}]
0 голосов
/ 11 апреля 2019

данные в файле 'd', от gnu sed,

sed -E 's/^[^\[]+(\[\{.+\})[^\}]+/\1/' d

рассмотрите возможность использования регулярных выражений в Perl, если вы будете работать с обработкой строк Json

...