以下に「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 -a
orperl -F
配列を使用する@F
のは「魔法」なので、最初の例でもそれを使用しました。 「フィールド」を意味します。$F[0]
最初のフィールドです。