다음 형식의 텍스트 파일이 있습니다.
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
스크립트를 약간 변경하면 outbase
awk의 옵션을 사용하여 명령줄에서 이를 설정할 수 있습니다 -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이 언급했듯이 이 방법은 특히 대용량 파일이 있는 경우 속도가 느립니다.