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

时间:2015-07-21 18:03:10

标签: unix awk ksh

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

使用awk,我该怎么打印出来:

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

我需要重新排列某些内容的顺序,还是为每个子字段使用不同的分隔符,而不是在目录结构中包含最后两条路径信息?

我的想法是在我的awk电话的输出上拨打awk,但这种情况很糟糕。

为清晰起见编辑:

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

2 个答案:

答案 0 :(得分:2)

您不需要在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

答案 1 :(得分:2)

您也可以定义多个分隔符

 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