gpt4 book ai didi

perl - awk sed perl 根据关键字匹配合并行

转载 作者:行者123 更新时间:2023-11-29 09:21:42 27 4
gpt4 key购买 nike

由于我有限的 awk/sed 魔法,我一直在用头撞墙解决这个问题。我很乐意使用 awk、sed、bash、perl 或其他任何工具来完成此文本操作。

我有以下输出,并希望根据某种键匹配来合并行:

 Node: server1
Active Server: SECONDARY
Standby Server: PRIMARY
Primary 192.168.1.1
Secondary 192.168.1.2

Node: server2
Active Server: PRIMARY
Standby Server: SECONDARY
Primary 10.1.1.1
Secondary 10.1.1.2

期望的输出:

 Node: server1
Active Server: Secondary 192.168.1.2
Standby Server: Primary 192.168.1.1

Node: server2
Active Server: Primary 10.1.1.1
Standby Server: Secondary 10.1.1.2

所以我需要根据单词“primary”和“secondary”合并行。我的第一个想法是将“Primary”更改为“PRIMARY”,以便更容易匹配。

我的最终目标是:

 server1,Active,192.168.1.2,Standby,192.168.1.1
server2,Active,10.1.1.1,Standy,10.1.1.2

(但我可以在帮助合并行后弄清楚这部分)

感谢您的帮助!

最佳答案

这个 Perl 解决方案似乎可以满足您的要求。它只是将值逐行提取到散列中,并在所有必需的值都存在时转储散列内容。

更新 我使用了来自List::Utilany代替 grep 使代码更清晰。

use strict;
use warnings;
use autodie;

use List::Util 'any';

my @names = qw/ node active standby primary secondary /;

open my $fh, '<', 'myfile.txt';

my %server;

while (my $line = <$fh>) {
next unless my ($key, $val) = lc($line) =~ /(\w+).*\s+(\S+)/;

%server = () if $key eq 'server';
$server{$key} = $val;

unless ( any { not exists $server{$_} } @names ) {
printf "%s,Active,%s,Standby,%s\n", @server{'node', $server{active}, $server{standby}};
%server = ();
}
}

输出

server1,Active,192.168.1.2,Standby,192.168.1.1
server2,Active,10.1.1.1,Standby,10.1.1.2

关于perl - awk sed perl 根据关键字匹配合并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com