awk 使用多字段分隔符转置数据

tgr*_*eis 8 awk

我正在尝试仅使用一个 awk 命令来执行以下操作。我有一个具有以下结构的文本文件

文件字段描述(不在文件中)

第一个字段用“:”分隔,最后一个字段(主机列表)用空格分隔
Uniq id:名称:唯一标识符:host_list(可以为空到多个并且可以重复)

文件内容
sv_0:blabla:205700DD4C506261796ED3:Host_10 Host_1 Host_16
sv_111:abcd:205700DD4C50629585735C:Host_10
sv_3:xpto1:2057008E714F629B3BCDCF:Host_11 Host_10
sv_46:something:205700DD4C50629E5AB93A:
Run Code Online (Sandbox Code Playgroud)
需要将此输入转换为此输出
sv_0 blabla 205700DD4C506261796ED3 Host_10
sv_0 blabla 205700DD4C506261796ED3 Host_1
sv_0 blabla 205700DD4C506261796ED3 Host_16
sv_111 abcd 205700DD4C50629585735C Host_10
sv_3 xpto1 2057008E714F629B3BCDCF Host_11
sv_3 xpto1 2057008E714F629B3BCDCF Host_10
sv_46 something 205700DD4C50629E5AB93A
Run Code Online (Sandbox Code Playgroud)

使用下一个命令可以,但我不喜欢一个接一个地使用管道

awk -F: '{print $1" "$2" "$3" "$4 }' file.txt | awk '{nfield=4; while (NF >= nfield) {print $1" "$2" "$3" "$nfield; nfield++}}'

Rom*_*est 6

使用单个gawk命令:

awk -F'[: ]' '{ for (i=4;i<=NF;i++) print $1,$2,$3,$i }' file.txt
Run Code Online (Sandbox Code Playgroud)
sv_0 blabla 205700DD4C506261796ED3 Host_10
sv_0 blabla 205700DD4C506261796ED3 Host_1
sv_0 blabla 205700DD4C506261796ED3 Host_16
sv_111 abcd 205700DD4C50629585735C Host_10
sv_3 xpto1 2057008E714F629B3BCDCF Host_11
sv_3 xpto1 2057008E714F629B3BCDCF Host_10
sv_46 something 205700DD4C50629E5AB93A
Run Code Online (Sandbox Code Playgroud)