Perlの複数の列を持つLinuxファイルのループコマンド

Perlの複数の列を持つLinuxファイルのループコマンド

以下に「n」個の列を持つfile.txtがあります。ループでコマンドを実行する必要があり、最初の列値と2番目の列値が必要です。完了したら、コマンドを実行して最初と3番目の列の値を取得し、行のすべての列を処理し続けます。

例:

vcloud <ktrcigmv> diskcommand <persistent-disk-1>
vcloud <ktrcigmv> diskcommand <persistent-disk-2>
vlcoud <ktrcsnu1> diskcommand <persistent-disk-1>
vlcoud <ktrcsnu1> diskcommand <persistent-disk-4>
vlcoud <ktrcsnu1> diskcommand <persistent-disk-6>

入力する(?):

ktrcigmv       persistent-disk-1 persistent-disk-2
ktrcsnu1       persistent-disk-1 persistent-disk-4 persistent-disk-6
ktrsapahn       vol-71412041887658--dev-sdd-cc04ce65
ktrai2y5h       persistent-disk-1
ktrcibiy       persistent-disk-1
ktrcigf2       persistent-disk-1
ktrcisxh       persistent-disk-1
ktrsapmam       vol-345052022286--dev-sdb-b5d5bdfd vol-345052022286--dev-sdf-9c91de4d
ktrcie8x       persistent-disk-1
ktrcio3s       persistent-disk-1

答え1

使用perlモードawk

<file.txt perl -lae '
   system "vcloud", $F[0], "diskcommand", $_ for @F[1..$#F]'

vcloud field-1 diskcommand field-nそれぞれ実行されますフィールド2..ゲームの最後(配列インデックスは1から1ではなく0から始まるため、perl各行1..$#Fに1つずつあります。)

フィールド区切り文字は、すべてのASCIIスペースシーケンス(スペース、タブ、垂直タブ、フォームフィード、キャリッジリターン)です。各行の先頭と末尾のスペースは無視されます。

答え2

おそらくそうです。求める:

vcloud ktrcigmv
diskcommand persistent-disk-1
vcloud ktrcigmv
diskcommand persistent-disk-2
vcloud ktrcsnu1
diskcommand persistent-disk-1

または、「vcloud...」の後にTabキーを使用してください。一番下入力としてのOPの一部:

vcloud ktrcigmv diskcommand persistent-disk-1
vcloud ktrcigmv diskcommand persistent-disk-2
vcloud ktrcsnu1 diskcommand persistent-disk-1
vcloud ktrcsnu1 diskcommand persistent-disk-4
vcloud ktrcsnu1 diskcommand persistent-disk-6
vcloud ktrsapahn        diskcommand vol-71412041887658--dev-sdd-cc04ce65
vcloud ktrai2y5h        diskcommand persistent-disk-1
vcloud ktrcibiy diskcommand persistent-disk-1
vcloud ktrcigf2 diskcommand persistent-disk-1
vcloud ktrcisxh diskcommand persistent-disk-1
vcloud ktrsapmam        diskcommand vol-345052022286--dev-sdb-b5d5bdfd
vcloud ktrsapmam        diskcommand vol-345052022286--dev-sdf-9c91de4d
vcloud ktrcie8x diskcommand persistent-disk-1
vcloud ktrcio3s diskcommand persistent-disk-1

これは次のとおりですトップ「<」を引いたOPの一部です。

たとえば、次のようになります。

while (<>) {
    ($v, @ds) = split;
    for $d (@ds) { 
        print "vcloud $v\t";
        print "diskcommand $d\n";
    }
}

その後、「印刷」を「システム」に置き換えます。

($v, @ds)周囲の括弧が必要です。ここで、最初の項目は残りの項目と区別されます。


私の最初の説明(逆に、入力=出力):

while (<>) {
    @F = split;
    $tbl{$F[1]} .= $F[3];
}
for $k (keys %tbl) {
    print "$k $tbl{$k}", "\n";
}

これは以下を印刷します:

]# perl kt.pl ktxt 
<ktrcigmv> <persistent-disk-1><persistent-disk-2>
<ktrcsnu1> <persistent-disk-1><persistent-disk-4><persistent-disk-6>

喜んで説明します。

「自動分割」perl -a ...オプションを使用すると、次のように圧縮できます。

$tbl{$F[1]} .= "$F[3] ";
END {
for $k (keys %tbl) { print "$k:   $tbl{$k}", "\n" }
}

これで、いくつかの書式が追加され、印刷されます。

]# perl -a kt.pl ktxt 
<ktrcsnu1>:   <persistent-disk-1> <persistent-disk-4> <persistent-disk-6> 
<ktrcigmv>:   <persistent-disk-1> <persistent-disk-2>

perl -aorperl -F配列を使用する@Fのは「魔法」なので、最初の例でもそれを使用しました。 「フィールド」を意味します。$F[0]最初のフィールドです。

関連情報