Разделить массивный файл yaml на N допустимых файлов yaml - PullRequest
0 голосов
/ 23 сентября 2019

У меня большой файл yaml:

---
foo: bar
baz:
  bacon: true
  eggs: false
---
goo: car
star:
  cheese: true
  water: false
---
dog: boxer
food:
  turkey: true
  moo: cow
---
...

Что я хотел бы сделать, это разбить этот файл на n-количество действительных файлов yaml.

Я попытался сделать это с помощью csplit в bash:

Но в конечном итоге получилось либо намного больше файлов, чем мне нужно: csplit --elide-empty-files -f rendered- example.yaml "/---/" "{*}"

или разделение, где последнийФайл содержит большую часть содержимого: csplit --elide-empty-files -n 3 -f rendered- app.yaml "/---/" "{3}"

Это не идеально.Что я действительно хочу, так это возможность сказать, разделить файл yaml на три части, где он разделяется на ближайший разделитель.Я знаю, что это не всегда будет действительно треть.

Есть какие-нибудь идеи о том, как этого добиться в bash?

1 Ответ

0 голосов
/ 23 сентября 2019

Моя идея не однострочная, но это работает.

#!/bin/bash
file=example.yaml
output=output_
count=$(cat ${file} | wc -l)
count=$((count + 1))
lines=$(grep -n -e '---' ${file} | awk -F: '{ print $1 }')
lines="${lines} ${count}"
start=$(echo ${lines} | awk '{ print $1 }')
lines=$(echo ${lines} | sed 's/^[0-9]*//')

for n in ${lines}
do
    end=$((n - 1))
    sed -n "${start},${end}p" ${file} > "${output}${start}-${end}.yaml"         
    start=$n
done
...