通信を使用した結果のグループ化

通信を使用した結果のグループ化

comm私が得た結果は、次のように奇妙に見えます。

comm -3 <(. "$first_env_file"; env) <(. "$second_env_file"; env) 

私は次のようなものを得ます:

AUTH_LP_ACCOUNT_ID=xxx1
        AUTH_LP_ACCOUNT_ID=xxx2
        AWS_IMAGE_DOMAIN_NAME=abc
AWS_IMAGE_DOMAIN_NAME=zyx
NODE_ENV=local
        NODE_ENV=staging
        NODE_PORT=3000
NODE_PORT=4000
REDIS_HOST=localhost
        REDIS_HOST=redis

(はい、先行スペース(前のタブ/スペース)があります)

私はそれが次のように見えるようにしたいです:

--begin--
AUTH_LP_ACCOUNT_ID=xx1
AUTH_LP_ACCOUNT_ID=xx2
---------
AWS_IMAGE_DOMAIN_NAME=abc
AWS_IMAGE_DOMAIN_NAME=zyx
---------
NODE_ENV=local
NODE_ENV=staging
---------
NODE_PORT=3000
NODE_PORT=4000
---------
REDIS_HOST=localhost
REDIS_HOST=redis
---end---

これを行う方法はありますか?

  1. 前に付いた行を削除するには、 `sed's/^ *// を通してパイプすることができます。
  2. 開始/終了に--begin--andを付けるのは簡単です。---end---
  3. しかし、結果をどのように簡単にグループ化できますか?

3の私の唯一の推測は、各行を繰り返し(最初にスキップ)、次の結果にabc =と異なるxxx =がある場合はaを印刷することです。--------しかし、私はそれが好きではありません。

答え1

3に対する私の唯一の推測は、各行を繰り返し(最初にスキップ)--------次の結果がabc =と異なるxxx =を持つ場合に印刷することです。しかし、私はそれが好きではありません。

あなたの推測は良いです。 awkでやってください。

comm ... | sed 's/^\t//' | awk -F= 'NR == 1 {cur = $1; print "---- begin ----"} cur != $1 {print "---------"} {cur = $1; print} END {print "---- end ----"}'

読みやすくするために改行を追加します。

comm ... | sed 's/^\t//' | awk -F= '
NR == 1 {
  cur = $1;
  print "---- begin ----"
}
cur != $1 {
  print "---------"
}
{
  cur = $1;
  print
}
END {
  print "---- end ----"
}'

提供されたサンプルの出力:

---- begin ----
AUTH_LP_ACCOUNT_ID=xxx1
AUTH_LP_ACCOUNT_ID=xxx2
---------
AWS_IMAGE_DOMAIN_NAME=abc
AWS_IMAGE_DOMAIN_NAME=zyx
---------
NODE_ENV=local
NODE_ENV=staging
---------
NODE_PORT=3000
NODE_PORT=4000
---------
REDIS_HOST=localhost
REDIS_HOST=redis
---- end ----

関連情報