1

我有一个很大的 yaml 文件:

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

我想做的是将此文件拆分为 n 个有效的 yaml 文件。

我尝试在 bash 中使用 csplit 执行此操作:

但最终得到的文件比我想要的要多得多: csplit --elide-empty-files -f rendered- example.yaml "/---/" "{*}"

或最后一个文件包含大部分内容的拆分: csplit --elide-empty-files -n 3 -f rendered- app.yaml "/---/" "{3}"

这是不理想的。我真正想要的是能够说,将 yaml 文件分成三份,并在最近的分隔符处分割。我知道这并不总是真正的三分之二。

关于如何在 bash 中完成此任务的任何想法?

4

2 回答 2

0

我的想法不是单行的,但这很有效。

#!/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
于 2019-09-22T22:58:51.747 回答
0

我认为没有办法用 csplit 做到这一点。我能够使用 awk 将其拆分为 1000 个 yaml 文档的文件:

awk '/---/{f="rendered-"int(++i/1000);}{print > f;}' app.yaml

要获得准确的三个文件,您可以尝试以下操作:

awk '/---/{f="rendered-"(++i%3);}{print > f;}' app.yaml
于 2020-10-08T21:04:57.867 回答