[英]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.