提取每个ID的主要和辅助号码并生成JSON字符串

use*_*349 2 bash shell perl sed jq

我有两个文件,如下所示:一般来说,我将有三个以上的客户端ID,每个ID的主要和次要号码将在50-60左右.

primary.txt

{1=[0, 273, 546, 819], 2=[274, 1, 820], 3=[1016, 275, 821]}
Run Code Online (Sandbox Code Playgroud)

这意味着客户端ID 1具有主要编号[0, 273, 546, 819].与其他ID类似.

secondary.txt

{1=[342, 1102, 608, 684], 2=[115, 191, 837, 1559], 3=[1256, 116]}
Run Code Online (Sandbox Code Playgroud)

这意味着客户端ID 1具有辅助号码[342, 1102, 608, 684].与其他ID类似.

我需要读取这两个文件,为每个ID组合主要和次要号码,并为每个ID创建一个这样的JSON字符串.

对于clientid 1

{"text":"for client id one.","pri":[0, 273, 546, 819],"sec":[342, 1102, 608, 684]}
Run Code Online (Sandbox Code Playgroud)

对于客户ID 2

{"text":"for client id two.","pri":[274, 1, 820],"sec":[115, 191, 837, 1559]}
Run Code Online (Sandbox Code Playgroud)

对于客户ID 3

{"text":"for client id three.","pri":[1016, 275, 821],"sec":[1256, 116]}
Run Code Online (Sandbox Code Playgroud)

是否可以在shell脚本或Perl中执行此操作?我只是想在控制台上打印出来.以下是我尝试过但我无法弄清楚如何为每个客户端ID制作正确的JSON.

for n in {1..3}
do
  echo "$n:"
  for f in primary.txt secondary.txt
  do
    sed -r "s/.*\b$n=\[([^]\]+).*/\1/" $f
  done
echo
done
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

用Perl.使用正则表达式将数据提取到带有数字的哈希clientid =>字符串中.然后通过拆分该字符串获得的arrayref覆盖该值.然后将两个这样的哈希值组合成一个hashref,使用JSON :: XS将其转换为JSON

use warnings;
use strict;
use feature 'say';

use JSON::XS;

my ($f1, $f2) = ('primary.txt', 'secondary.txt');

open my $fh, '<', $f1 or die "Can't open $f1: $!";
my %h1 = <$fh> =~ /(\d+)=\[(.*?)\]/g;
$h1{$_} = [ split /,\s*/, $h1{$_} ]  for keys %h1; 

open $fh, '<', $f2 or die "Can't open $f2: $!";
my %h2 = <$fh> =~ /(\d+)=\[(.*?)\]/g;
$h2{$_} = [ split /,\s*/, $h2{$_} ]  for keys %h2; 
close $fh;

my %client_id = ( 1 => 'one', 2 => 'two', 3 => 'three' );

for (keys %client_id) {
    my $for_json = {
        "text" => "for client id $client_id{$_}.",
        "pri" => $h1{$_},
        "sec" => $h2{$_},
    };
    my $coder = JSON::XS->new;
    my $json = $coder->encode($for_json);
    say $json;
}
Run Code Online (Sandbox Code Playgroud)

如果两者的处理确实总是相同,则将其放入子例程中

my ($f1, $f2) = ('primary.txt', 'secondary.txt');

my %h1 = %{ clientID_nums($f1) };
my %h2 = %{ clientID_nums($f2) };

...

sub clientID_nums {
    my ($file) = @_; 

    open my $fh, '<', $file or die "Can't open $file: $!";
    my %h = <$fh> =~ /(\d+)=\[(.*?)\]/g;
    $h{$_} = [ split /,\s*/, $h{$_} ]  for keys %h; 

    return \%h;
}
Run Code Online (Sandbox Code Playgroud)

实际上只生成(并打印)JSON字符串

say JSON::XS->new->encode($for_json);
Run Code Online (Sandbox Code Playgroud)

或者更确切地说,使用模块的功能界面

say encode_json $for_json;
Run Code Online (Sandbox Code Playgroud)

其中encode_json在默认情况下导出的(并期望发射和UTF-8).