use*_*349 2 bash shell perl sed jq
我有两个文件,如下所示:一般来说,我将有三个以上的客户端ID,每个ID的主要和次要号码将在50-60左右.
{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类似.
{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字符串.
{"text":"for client id one.","pri":[0, 273, 546, 819],"sec":[342, 1102, 608, 684]}
Run Code Online (Sandbox Code Playgroud)
{"text":"for client id two.","pri":[274, 1, 820],"sec":[115, 191, 837, 1559]}
Run Code Online (Sandbox Code Playgroud)
{"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)
用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).