텍스트 파일을 새 파일로 분할

텍스트 파일을 새 파일로 분할

다음 형식의 텍스트 파일이 있습니다.

Model        1   
Atom….
Atom….
Atom….
ENDMDL
Model        2   
Atom….
Atom….
Atom….
ENDMDL
Model       n   
Atom….
Atom….
Atom….
ENDMDL

이 파일을 모델별로 분할해야 합니다. 새 파일의 이름은 모델 번호를 기준으로 합니다.

답변1

이 작업은 작은 도구를 사용하여 쉽게 수행할 수 있습니다.스크립트.

#!/usr/bin/awk -f 
# Write sections of the input file to separate files
# Written by PM 2Ring 2016.06.14

BEGIN{outbase = "outfile"}

/^Model/{outname = outbase $2}

{print > outname}

outbase기본 파일 이름입니다. 모델 번호가 추가되므로 예제 파일의 경우 출력 파일이 생성됩니다 outfile1. outfile2스크립트를 약간 변경하면 outbaseawk의 옵션을 사용하여 명령줄에서 이를 설정할 수 있습니다 -v.

이 스크립트의 핵심은

/^Model/{outname = outbase $2}

현재 행이 "Model"로 시작하는 경우 필드 #2의 내용을 문자열에 추가 outbase하고 결과를 에 할당합니다 outname.

기본적으로 awk는 파일을 한 줄씩 처리하며 공백을 필드 구분 기호로 사용하여 각 줄을 필드로 분할합니다.

{print > outname}

이름이 에 저장된 파일에 현재 줄을 인쇄합니다 outname.


이 스크립트는 전체 내용을 명령줄에 작성할 수 있을 만큼 작습니다.

awk 'BEGIN{outbase = "outfile"}; /^Model/{outname = outbase $2}; {print > outname}' infile.txt

실제로 여러 입력 파일 매개변수를 제공할 수 있으며 중복 모델이 없는 한 해당 매개변수는 올바르게 처리됩니다.

답변2

을 사용할 수 있습니다 csplit. 이는 다음 이름의 파일에 대해 작동합니다 file.txt.

csplit -ksz file.txt '/^Model/' '{*}'
for xx in xx*
do
    newname=$(awk '{print $2; exit}' "$xx")
    test ! -f "$newname" && mv -f "$xx" "$newname"
done

RE를 기준으로 여러 부분으로 나눕니다 csplit. 파일 이름은 (기본적으로) 단조롭게 증가하는 숫자 접미사 file.txt로 명명됩니다 . xx각 파일을 차례로 살펴보고 파일에 있는 모델 번호로 이름을 바꿉니다.

xx*루프 끝에서 일치하는 모든 파일에는 중복된 모델 번호가 포함되어 있습니다(이름 변경은선착순베이스).

답변3

#!/bin/bash                                                                                                                                                                                                                                   

while read -r line                                                                                                                                                                                                                            
do                                                                                                                                                                                                                                            
    case $line in                                                                                                                                                                                                                             
        Model*)                                                                                                                                                                                                                               
            f="${line//[[:space:]]/}"
            touch "$f"  # file name without white spces                                                                                                                                                                                                                     
            ;;                                                                                                                                                                                                                                
        ENDMDL)                                                                                                                                                                                                                               
            :                                                                                                                                                                                                                                 
            ;;                                                                                                                                                                                                                                
        *)                                                                                                                                                                                                                                    
            echo "$line" >> "$f"                                                                                                                                                                                                              
            ;;                                                                                                                                                                                                                                
    esac                                                                                                                                                                                                                                      
done < "$1"

이 같은. 모델 파일을 실행하려면 인수로 모델 파일을 제공해야 합니다../script_name models.txt

@PM 2Ring이 언급했듯이 이 방법은 특히 대용량 파일이 있는 경우 속도가 느립니다.

관련 정보