如何使用不同的分隔符将awk字段拆分为更多字段



假设我有"a b user.group@server c /dir/foo/bar/last2/notneeded"

使用awk,我如何将其打印为:

"a b user c server group /dir/foo/bar"

在哪里我需要重新安排一些事情的顺序,以及使用不同的分隔符为每个子字段,不包括目录结构中的最后2条路径信息?

我的想法是在我的awk调用的输出上调用awk,但这不幸失败了。

编辑:

大多数数据是空格分隔的,但其中2个字段有自己的字段。我希望能够将user.group@server分成3个单独的字段,并截断/dir/foo/bar/last2/notneeded中路径的最后2块,成为/dir/foo/bar

您实际上不需要拆分user.group@server中的字段,因为有三个字段用于两种类型的分隔符。相反,您可以使用matchsubstr

如果在a.awk

中输入以下内容
 {
    sub(//[^/]*/[^/]*$/, "", $NF)
    match($3, /.*./)
    user = substr($3, RSTART, RLENGTH - 1)
    match($3, /..*@/)
    group = substr($3, RSTART + 1, RLENGTH - 2)
    server = substr($3, index($3, "@") + 1)
    print $1, $2, user, $4, server, group, $NF
}

和运行

awk -f a.awk foo.txt

你会得到

a b user c server group /dir/foo/bar

也可以定义多个分隔符

 awk -F"[ .@]" '{print $1, $2, $3, $6, $5, $4, $7}'

返回

a b user c server group /dir/foo/bar/last2/notneeded

对于最后一个字段,可以使用bkmoney进行替换。

 awk -F"[ .@]" '{sub(//[^/]*/[^/]*$/, "", $7);print $1, $2, $3, $6, $5, $4, $7}'

返回
 a b user c server group /dir/foo/bar

最新更新