sat*_*ort 0 sed awk aix text-processing
我在很多行上都有类似这种模式的文本。我可以只将值和名称组合成一行吗?
ABCDEFG_10_node10:2154 ABCDEFG_10_node10:54
ABCDEFG_10_node10:2254 ABCDEFG_10_node10:64
ABCDEFG_10_node10:410 ABCDEFG_10_node10:10
ABCDEFG_10_node10:210 ABCDEFG_10_node10:10
ABCDEFG_10_node10:365
ABCDEFG_10_node10:890
ABCDEFG_10_node10:741
XXYZZ_71_node2:24: XXYZZ_71_node2:504:
X3y5z_53_node1:664: X3y5z_53_node1:990:
RCTY_11_node2:224: RCTY_11_node2:234:
Run Code Online (Sandbox Code Playgroud)
预期输出:
ABCDEFG_10_node10: 2154,2254,410,210,365,890,741,54,64,10,10
XXYZZ_71_node2: 24,504
X3y5z_53_node1: 664,990
RCTY_11_node2: 224,234
Run Code Online (Sandbox Code Playgroud)
我在 AIX 上。我怎样才能做到这一点?
Perl 方法(假设顺序不重要):
$ perl -lne 'while(/(\w+):(\d+)/g){
push @{$k{$1}},$2
}
END{
print "$_: " . join ",", @{$k{$_}} for keys %k
}' file
ABCDEFG_10_node10: 2154,54,2254,64,410,10,210,10,365,890,741
Run Code Online (Sandbox Code Playgroud)
它逐行读取输入文件 ( -ln
) 并在其-e
上运行由 给出的脚本。在while(/(\w+):(\d+)/g)
将收集非空格的所有实例,随后:
再多个非空白。由于它们在括号中被捕获,因此$1
将是名称和$2
值。然后将它们推送到数组的散列中(散列%k
,其值为数组)。最后,我们打印散列的每个键(名称)及其值的数组,由,
.
如果你重视简洁,你可以把上面写成一行:
perl -lne 'while(/(\S+):(\S+)/g){push @{$k{$1}},$2}}{$"=",";print"$_: @{$k{$_}}" for keys%k' file
Run Code Online (Sandbox Code Playgroud)
超越易读性:
perl -nE'push@{$k{$1}},$2while/(\w+):(\d+)/g}{$"=",";say"$_: @{$k{$_}}"for keys%k' file
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
414 次 |
最近记录: |