セミコロンで始まる行で区切られたテキストの分割

セミコロンで始まる行で区切られたテキストの分割

コマンドの出力があります(plantuml -language;参照BBEditコードレス言語モジュールのキーワード、事前定義された名前、記号のリストはありますか?背景)実際には次のようになります。

;type1
;3
@fff
@ggg
hhh

;preprocessor
;1
!undef

;keyword
;3
!undef
test
somemore

.
.
.

1 番目は;名前を表し、2 番目は;次の行のエントリ数を表します。これらの項目の後には、次のブロックが始まる空白行が続きます。

出力全体をさらに処理する別のファイル(名前付き)に分割したいと思います。

文書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
  • フィールド数が0(空行)の場合は、次の行に進みます。
  • フィールド数が1(セミコロンで始まる行)を超える場合は、変数を設定して次の行を取得しますが、処理せずにfilename(スキップして)次の行に進みます。
  • それ以外の場合は、その行を印刷して出力をファイルにリダイレクトしますfilename

答え2

やるよ

awk -F '\n' -v RS= '{f=substr($1, 2); for (i=3; i<=NF; i++) print $i > f}' file

awk 言語では、ファイルは「レコード」で構成され、レコードには「フィールド」が含まれます。既定では、1 つのレコード == 1 行ですが、構成できます。

これは、入力レコード区切りRS変数を空の文字列として使用します。つまり、一連の空行がレコードを区別するという意味です。フィールド区切り文字を改行文字に設定しました。要約すると、ファイルの各「段落」はレコードであり、段落内の各行はフィールドです。

呼び出しsubstrでは、先行セミコロンのみが省略されます。

実際には、データ行の数が2番目の行の「n」値と実際に等しいことを確認するものではありません;

関連情報