n번 발생하는 문자열마다 텍스트 파일을 필드(열)에 저장합니다.

n번 발생하는 문자열마다 텍스트 파일을 필드(열)에 저장합니다.

Cisco 패브릭 구성의 Excel 스프레드시트를 생성 중이며 가져올 필드/열에 직접 서식을 적용하고 싶습니다.

물론 수정된 정보가 포함된 형식은 다음과 같습니다.

zone name Zone1_HOSTNAME01 vsan XXX
  fcalias name STORAGEPORT_0 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name STORAGEPORT_1 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name STORAGEPORT_2 vsan XXX
    pwwn xx:xx:xx:xx:xx

zone name Zone2_HOSTNAME02 vsan XXX
  fcalias name STORAGEPORT_3 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name STORAGEPORT_4 vsan XXX
    pwwn xx:xx:xx:xx:xx

  fcalias name HOSTNAME02 vsan XXX
    pwwn xx:xx:xx:xx:xx

따라서 내가 원하는 것은 영역 이름 ZONE NAME의 모든 내용을 1 필드의 "vsan" 공간에 포함시킨 다음 "zone name"이 포함된 줄의 시작 부분이 나타날 때까지 각 문자열을 자체 필드에 넣는 것입니다. 그런 다음 구분 기호를 사용하여 원하는 것을 얻을 수 있습니다. 그래서 본질적으로 내가 궁극적으로 원하는 것은 다음과 같습니다.

"zone name Zone1_HOSTNAME01" "vsan" "XXX" "fcalias name" "STORAGEPORT_0 vsan XXX" "pwwn xx:xx:xx:xx:xx" "fcalias name" "STORAGEPORT_1 vsan XXX" "pwwn xx:xx:xx:xx:xx" "fcalias name" "STORAGEPORT_2 vsan XXX" "pwwn xx:xx:xx:xx:xx"

또는 그런 것. 나중에 열을 더 쉽게 조작할 수 있으므로 각 공백은 자체 필드에 있을 수 있습니다.

텍스트 파일에는 800줄이 넘으며 일부는 더 클 수도 있지만 명확하지 않습니다. 가장 큰 문제는 "Area Name...."으로 시작하는 첫 줄 뒤에 오는 텍스트가 다를 수 있으므로 다음에 오는 내용에 관계없이 그냥 해당 필드로 번역합니다.

답변1

다음 스크립트는 필드 내에 공백이 있기 때문에 perl탭으로 구분된 형식( )으로 입력 파일을 출력합니다 .markizy.txt

#!/usr/bin/perl

while(<>) {
  chomp;
  s/ +(vsan|fcalias|pwwn) */\t$1 /g ;
  s/ +\t/\t/;

  if ($. > 1 && m/^zone name/) {
    print $l,"\n";
    $l = $_;
  } elsif (eof) {
    $l .= $_;
    print $l,"\n";
  } else {
    $l .= $_;
  };
};

perl$.내장 변수는 현재 줄 번호이므로 스크립트는 input 의 첫 번째 줄에 있을 때 인쇄(빈 줄)를 방지합니다. 이 변수와 기타 여러 변수(및 for와 같은 긴 별칭)에 대한 자세한 내용은 zone name참고자료를 참조하세요 .man perlvar$INPUT_LINE_NUMBER$.

파일로 저장하고 를 사용하여 실행 가능하게 만든 chmod +x후 실행합니다. 예를 들어 cat -T탭( ^I)을 표시합니다.

$ ./markizy.pl markizy.txt  | cat -T
zone name Zone1_HOSTNAME01^Ivsan XXX^Ifcalias name STORAGEPORT_0^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_1^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_2^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx
zone name Zone2_HOSTNAME02^Ivsan XXX^Ifcalias name STORAGEPORT_3^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_4^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name HOSTNAME02^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx

파이핑을 하면 cat -T출력에 탭으로 구분된 필드가 있음을 알 수 있습니다(그렇지 않으면 공백과 크게 다르지 않기 때문입니다). 실제로 실행할 때 사용하지 말고 파일로 리디렉션하십시오. Excel(또는 gnumeric거의 Libre Office Calc모든 다른 스프레드시트)은 탭으로 구분된 텍스트 파일을 가져오는 데 아무런 문제가 없습니다. 이는 제가 기억하는 한 거의 오랫동안 표준 기능이었습니다.

실제로 실행하려면:

./markizy.pl markizy.txt > markizy.csv

가져올 때 데이터가 쉼표로 구분되지 않고 탭으로 구분되어 있음을 Excel에 알려야 할 수도 있습니다. 그렇지 않으면 해당 사실을 감지할 수 있습니다.

또는 데이터 필드에 쉼표가 포함되어 있지 않다고 확신하는 경우 \t스크립트의 모든 s를 쉼표로 바꾸어 쉼표로 구분할 수 있습니다.

답변2

장기적으로는 Excel에서 전체 작업을 수행하는 것이 더 쉬울 수 있습니다. 예제를 잘라내어 텍스트 파일에 붙여넣은 다음 Excel에서 열어 다음을 얻었습니다.

여기에 이미지 설명을 입력하세요.

여기에서 전역 검색 및 바꾸기 명령을 사용하여 원하는 대로 수정할 수 있습니다.

답변3

분명히 일부 필드는 정렬된 데이터를 가져온 후 Excel에서 생성하는 문자열에서 고려되므로 생략될 수 있습니다. 더 나은 옵션이 있다고 확신하지만 이는 내 출력을 모두 차지하고 모든 값을 새 줄에 순서대로 배치한 다음 vsan|pwwn|'zone name'|fcalias에 대해 필요하지 않은 필드를 제거하고 나뭇잎을 남깁니다. me 영역 및 구성원 별칭과 pwwn 항목만 있으면 됩니다. 또한 모든 영역이 대문자 Z로 시작하므로 더 간단해집니다.

한 줄에 사용하는 코드는 다음과 같습니다.

grep -oP '\S+' switch01-zones-20160711 | grep -Ev 'name|vsan|^01|^02|fcalias|pwwn|zone' | awk '{printf "%s%s", (/^Zone/?rs:FS), $0; rs=RS} END{print ""}' >to-import.csv

이로 인해 각 지역에 대한 멋진 단일 행과 문자열 작성을 위해 Excel로 가져온 연결된 www 장치의 구성원 별칭이 모두 짧은 시간에 남았습니다.

관련 정보