使用 comm 对结果进行分组

使用 comm 对结果进行分组

使用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-----end---放在开始/结束处很容易
  3. 但如何轻松地对结果进行分组呢?

我对 3 的唯一猜测是循环每一行(先跳过),如果下一个结果有不同的 xxx= 与 abc= 则打印 a--------但我不喜欢这样。

答案1

我对 3 的唯一猜测是循环每一行(首先跳过),如果下一个结果有不同的 xxx= 与 abc= 则打印 -------- 但我不喜欢那样。

你的猜测很好。在 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 ----

相关内容