分割文本,以分号开头的行分隔

分割文本,以分号开头的行分隔

我有命令的输出(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”值;

相关内容