패턴을 사용하여 파일을 별도의 파일로 분할

패턴을 사용하여 파일을 별도의 파일로 분할

파일(예제 참조)을 별도의 파일로 분할해야 합니다. 각각의 새 파일은 7행 SAMPLE1.txt등 의 이름을 상속받아야 합니다 .SAMPLE2.txt

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE1
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE2
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE3
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

답변1

당신은 이것을 할 수 있습니다 awk:

awk '{
        if(/@File_Version:/){k=$0;}
        else{k=k"\n"$0}
     } 
    /^#Name/{n=$2}
    /EOD/{
        print k > n".txt"; 
    }' file 

설명하다

  • if(/^@File_Version:/){k=$0;}: 줄이 @File_Version:.로 시작하면 줄을 k. 로 저장합니다.
  • else{k=k"\n"$0}: 다른 모든 줄에는 개행 문자( \n)를 추가하고 그 뒤에 현재 줄의 현재 값을 추가합니다 k.
  • /^#Name/{n=$2}: 이 줄이 로 시작하는 경우 #Name변수는 n두 번째 필드(이름)로 설정됩니다.
  • /^EOD/{print k > n".txt";}: 이 줄이 로 시작하는 경우 EOD변수 k(현재 전체 레코드가 포함되어 있음)를 이전 단계에서 저장한 이름이 n.txt있는 파일에 인쇄합니다.n

답변2

awk '/#Name/{ x=$NF;  }; /#End_of_file_header/,/EOD/{ print > x} '  test1

줄이 로 시작하면 #namex의 마지막 단어가 저장됩니다. 그런 다음 #End_of_file_header및 로 구분된 모든 청크에 대해 EOD이름이 내용인 파일에 줄을 인쇄합니다.x

이렇게 하면 파일 헤더를 건너뛰고 데이터만 파일에 저장됩니다.

관련 정보