假设我有"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
中的字段,因为有三个字段用于两种类型的分隔符。相反,您可以使用match
和substr
。
如果在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