如何根据模式匹配从一个文件到另一个文件选择特定行

时间:2019-04-11 13:58:02

标签: linux shell awk sed

我想匹配一个模式,并在该模式匹配后完全选择下一行。我在file1中输入以下内容的文件:

{
    "lotsoftext": [
........
],
  {
        "Key": "Envvi",
        "Value": "model"
  },
  {
        "Key": "Department",
        "Value": "Sys"
  }
  {  
        "Key": "Subdept",
        "Value": "io"
  },
}
....

我想要输出像在单独的文件file2中一样 something_model-Sys

"Key": "Envvi","Key": "Department"->在所有文件中保持不变,但是值不断变化。一次可能是Sys,有时可能是Fin,等等。我只需要模式匹配"Key": "Envvi""Key": "Department"下面的行。在最终输出中,我在前面加上“ _”,然后加上下划线“ _”,然后在Department中的Ennvi连字符值中添加值。我用awk管理了一些内容以删除行,但无法匹配我想要的内容。对我来说,这看起来太复杂了。任何帮助请

2 个答案:

答案 0 :(得分:0)

答案1:

egrep -A 1 "Envvi|Department" example_1.txt | awk -F: -v ORS="-" '/Value/ {print tolower($2)}' | sed -e 's/[" ]//g' -e 's/-$/\n/' -e 's/^/aws_/'

输入:cat example_1.txt

{
    "Key": "Envvi",
    "Value": "model"
 },
 {
    "Key": "Department",
    "Value": "Sys"
 }
 {
    "Key": "Subdept",
    "Value": "io"
 }

输出:

something_model-sys

添加更多说明:

1)egrep -A 1“环境|部门” example_1.txt->这将搜索所需的键值,并在匹配(-A 1)之后打印该行和一行。仅此第一步的输出如下:

"Key": "Envvi",
"Value": "model"
--
"Key": "Department",
"Value": "Sys"

2)awk -F:-v ORS =“-”'/ Value / {print tolower($ 2)}'->这将从上一个输出中找到“值”对,并使用“:”打印第二个字段字段分隔符。 tolower()用于小写输出。以下是此步骤的输出。请注意,由于ORS设置为“-”,因此末尾没有换行符。

 "model"- "sys"-

3)sed -e's / [“] // g'->此部分从上一步获取输入,并删除所有出现的双引号和空格,以下是此步骤之后的输出。最后仍然没有换行符。

model-sys-

4)'s /-$ / \ n /'-> sed的第二部分采用上一步的输入,并用换行符替换最后出现的hypen(-)。以下是此步骤之后的输出。请注意,现在结尾处有换行符。

model-sys

5)'s / ^ / aws_ /'-> sed的最后一部分采用上一步的输入,并将“ aws_”字符串添加到该行的开头。

aws_model-sys

在GNU AWK(使用gsub)中工作的Answer 1的进一步改进/简化版本:

egrep -A 1 "Envvi|Department" example_1.txt | awk -F: -v ORS="-" '/Value/ {gsub(/[" ]/,"",$2); print tolower($2)}' | sed -e 's/-$/\n/' -e 's/^/aws_/' 

答案 1 :(得分:0)

如果'd'文件中的数据是通过gnu sed

sed -En '/\s*"Key":\s*"Envvi"|\s*"Key":\s*"Department"/{n;p}' d