shell 在一行中查找匹配项,并将此结果插入到后面的每一行中,直到它与END匹配

bvhaajcl  于 2023-04-07  发布在  Shell
关注(0)|答案(2)|浏览(114)

我有一个类似的文件

NAME : Name1
TYPE : Something2
TEST : Something3
END
NAME : Name2
TYPE : Something5
TEST : Something6
END

':'后面的所有内容都将是不同的值
重复此操作直到文件结束
我想创建另一个文件的输出看起来像

NAME : Name1
Name1 TYPE : Something2
Name1 TEST : Something3
END
NAME : Name2
Name2 TYPE : Something5
Name2 TEST : Something6
END

试过了

awk '/NAME/ {print;while($0!~ /END/){getline;print;}}' InputFile > OutputFile

但不知道如何在找到名称匹配时将其插入。
我使用shell脚本
任何帮助非常感谢
特里

yrefmtwq

yrefmtwq1#

一个awk的想法:

awk '
$1=="END"  { pfx = ""     }      # clear prefix
           { $1  = pfx $1 }      # append prefix to 1st field
$1=="NAME" { pfx = $NF " "}      # define prefix as last field + space
1                                # print current line
' InputFile

这产生:

NAME : Name1
Name1 TYPE : Something2
Name1 TEST : Something3
END
NAME : Name2
Name2 TYPE : Something5
Name2 TEST : Something6
END
3lxsmp7m

3lxsmp7m2#

使用任何POSIX awk,无论Name<N>中包含哪些字符,包括空格或: s:

$ awk '
    match($0,/^NAME[[:space:]]*:[[:space:]]*/) { name=substr($0,RLENGTH+1) }
    { print ( /^(NAME|END)/ ? "" : name " ") $0 }
' file
NAME : Name1
Name1 TYPE : Something2
Name1 TEST : Something3
END
NAME : Name2
Name2 TYPE : Something5
Name2 TEST : Something6
END

例如,使用具有一些更有趣的名称的此输入:

$ cat file
NAME : This Name
TYPE : Something2
TEST : Something3
END
NAME : That : Name
TYPE : Something5
TEST : Something6
END
$ awk '
    match($0,/^NAME[[:space:]]*:[[:space:]]*/) { name=substr($0,RLENGTH+1) }
    { print ( /^(NAME|END)/ ? "" : name " ") $0 }
' file
NAME : This Name
This Name TYPE : Something2
This Name TEST : Something3
END
NAME : That : Name
That : Name TYPE : Something5
That : Name TEST : Something6
END

相关问题