我有命令的输出(plantuml -language
;参见BBEdit 无代码语言模块的关键字、预定义名称、符号列表?背景)实际上看起来像这样:
;type1
;3
@fff
@ggg
hhh
;preprocessor
;1
!undef
;keyword
;3
!undef
test
somemore
.
.
.
第一个;
表示名称,第二个表示;
下一行中的项目数。这些项目后面是一个空行,下一个块开始。
我想将整个输出分割成单独的文件(以名称命名),我想进一步处理这些文件。
文件type1
:
@fff
@ggg
hhh
文件preprocessor
:
!undef
文件keyword
:
!undef
test
somemore
我如何使用 或 之类的工具来做到这awk
一点sed
?或者有更简单的工具吗?
答案1
也许不是最优雅的解决方案,但这似乎可以做到这一点:
awk -F';' '
NF==0 { next }
NF>1 && $1=="" { filename=$2; getline; next }
{ print > filename }
' file
- 如果字段数为零(空行),则继续下一行。
- 如果字段数大于 1(以分号开头的行),则设置变量
filename
,获取下一行,但不处理它(跳过它)并继续下一行。 - 否则,打印该行并将输出重定向到文件
filename
。
答案2
我会做
awk -F '\n' -v RS= '{f=substr($1, 2); for (i=3; i<=NF; i++) print $i > f}' file
请注意,在 awk 语言中,文件由“记录”组成,而记录包含“字段”。默认情况下,一条记录==一行,但这可以配置。
这使用输入记录分隔符RS
变量作为空字符串,这意味着空行序列分隔记录。我将字段分隔符设置为换行符。总而言之,文件的每个“段落”都是一条记录,段落中的每一行都是一个字段。
该substr
调用仅省略前导分号。
我实际上并没有检查数据行数实际上是否等于第二行的“n”值;
。