如何使用不同的分隔符将 awk 字段拆分为更多字段?
How to split up an awk field into more fields using different separators?
假设我有 "a b user.group@server c /dir/foo/bar/last2/notneeded"
使用 awk,如何将其打印为:
"a b user c server group /dir/foo/bar"
我在哪里需要重新排列一些东西的顺序以及为每个子字段使用不同的分隔符并且不包括目录结构中的最后 2 条路径信息?
我的想法是在我的 awk
调用的输出上调用 awk
,但失败得很惨。
为清楚起见编辑:
大部分数据是 space 分隔的,但其中 2 个字段有自己的字段。我希望能够将 user.group@server
分成 3 个单独的字段,并将 /dir/foo/bar/last2/notneeded
中的最后 2 条路径截断为 /dir/foo/bar
您实际上不需要拆分 user.group@server
中的字段,因为对于两种类型的分隔符有三个字段。相反,您可以使用 match
和 substr
.
如果你把下面的内容放在a.awk
{
sub(/\/[^/]*\/[^/]*$/, "", $NF)
match(, /.*\./)
user = substr(, RSTART, RLENGTH - 1)
match(, /\..*@/)
group = substr(, RSTART + 1, RLENGTH - 2)
server = substr(, index(, "@") + 1)
print , , user, , server, group, $NF
}
和运行
awk -f a.awk foo.txt
你会得到
a b user c server group /dir/foo/bar
您也可以定义多个分隔符
awk -F"[ .@]" '{print , , , , , , }'
这将 return
a b user c server group /dir/foo/bar/last2/notneeded
对于最后一个字段,您可以用 bkmoney 进行替换。
awk -F"[ .@]" '{sub(/\/[^/]*\/[^/]*$/, "", );print , , , , , , }'
returns
a b user c server group /dir/foo/bar
假设我有 "a b user.group@server c /dir/foo/bar/last2/notneeded"
使用 awk,如何将其打印为:
"a b user c server group /dir/foo/bar"
我在哪里需要重新排列一些东西的顺序以及为每个子字段使用不同的分隔符并且不包括目录结构中的最后 2 条路径信息?
我的想法是在我的 awk
调用的输出上调用 awk
,但失败得很惨。
为清楚起见编辑:
大部分数据是 space 分隔的,但其中 2 个字段有自己的字段。我希望能够将 user.group@server
分成 3 个单独的字段,并将 /dir/foo/bar/last2/notneeded
中的最后 2 条路径截断为 /dir/foo/bar
您实际上不需要拆分 user.group@server
中的字段,因为对于两种类型的分隔符有三个字段。相反,您可以使用 match
和 substr
.
如果你把下面的内容放在a.awk
{
sub(/\/[^/]*\/[^/]*$/, "", $NF)
match(, /.*\./)
user = substr(, RSTART, RLENGTH - 1)
match(, /\..*@/)
group = substr(, RSTART + 1, RLENGTH - 2)
server = substr(, index(, "@") + 1)
print , , user, , server, group, $NF
}
和运行
awk -f a.awk foo.txt
你会得到
a b user c server group /dir/foo/bar
您也可以定义多个分隔符
awk -F"[ .@]" '{print , , , , , , }'
这将 return
a b user c server group /dir/foo/bar/last2/notneeded
对于最后一个字段,您可以用 bkmoney 进行替换。
awk -F"[ .@]" '{sub(/\/[^/]*\/[^/]*$/, "", );print , , , , , , }'
returns
a b user c server group /dir/foo/bar