繁体   English   中英

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

[英]how to pick specific lines based on pattern match from a file to another file

我想匹配一个模式,并在该模式匹配后完全选择下一行。 我在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管理了一些内容以删除行,但无法匹配我想要的内容。 对我来说,这看起来太复杂了。 任何帮助请

答案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“ Envvi | Department” 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_/' 

如果gnu sed中的d文件中有数据,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM