Perl의 여러 열이 있는 Linux 파일의 루프 명령

Perl의 여러 열이 있는 Linux 파일의 루프 명령

아래와 같이 "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에서 시작하므로 perl1..$#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 -aor perl -F배열을 사용하는 @F것은 "마법적"이므로 첫 번째 예에서도 이를 사용했습니다. "필드"를 의미합니다. $F[0]첫 번째 필드입니다.

관련 정보