아래와 같이 "n"개의 열이 있는 file.txt가 있습니다. 루프에서 명령을 실행해야 하며 첫 번째 열 값과 두 번째 열 값이 필요합니다. 완료되면 명령을 실행하여 첫 번째 및 세 번째 열 값을 가져오고 행의 모든 열을 계속 처리합니다.
예:
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 in 1이 아닌 0에서 시작하므로 perl
각 1..$#F
행마다 하나씩 있습니다.)
필드 구분 기호는 모든 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
or perl -F
배열을 사용하는 @F
것은 "마법적"이므로 첫 번째 예에서도 이를 사용했습니다. "필드"를 의미합니다. $F[0]
첫 번째 필드입니다.