파일과 줄을 분할하는 방법

파일과 줄을 분할하는 방법

나는 가지고있다텍스트 파일좋다:

1_01                  { ; quite good spirals 


reset=2000 type=mandel passes=1
  corners=-0.6014129278/-0.5990935452/0.427747516/0.429487053
  params=0/0 float=y maxiter=1000 inside=0 outside=15
  distest=1/10/320/200 
  }

1_02                  { ; stringy one, with dist estimator
  reset=2000 type=mandel passes=1
  corners=-1.9228429644992/-1.9228427944992/-6.3749991620026e-008/6.375000\
  8379971e-008 params=0/0 float=y maxiter=1000 inside=0 outside=15
  distest=1/20/320/200
  }

1_03                  { ; OK, bit dull, not zoomed in far 
  reset=2000 type=mandel passes=1
  corners=0.3734922373/0.3820837907/-0.243292645/-0.23684898
  params=0/0 float=y maxiter=1000 inside=0 outside=15
  distest=1/10/320/200
  }

1_04                  { ; a mess, needs dist est
  reset=2000 type=mandel passes=1
  corners=-1.862224008886682/-1.86222400040936/-3.214020831358832e-009/3.1\
  43970347410528e-009 params=0/0 float=y maxiter=1000 inside=0
  outside=15 distest=1/10/320/200 
  }

다음과 같은 파일과 줄로 나누고 싶습니다.

1_01 { ; quite good spirals
reset=2000
type=mandel
passes=1
corners=-0.6014129278/-0.5990935452/0.427747516/0.429487053
params=0/0
float=y
maxiter=1000
inside=0
outside=15
distest=1/10/320/200
}

이제 bash 스크립트를 만들었습니다.

#!/usr/bin/env bash
# chmod +x s.sh
# ./s.sh
for f in *.txt; 
do  
 echo " found "$f " file ";
 #split -l 7 $f; 
 awk '/{/{n++}{print > n".p" }' $f
 echo $f "- split when { is found  and add p extension " ;
 rm $f;
 echo " input file " $f " is removed " ;
done

for f in *.p;   
do
 echo " in "$f " file replace space with newline and add par extension"
 # tr '{}' '()' < infile > outfile
 tr ' ' '\n' < $f >$f"ar"
 rm $f;
done

for f in *.par;     
do
 echo "remove blank= empty lines"
 sed -i '/^$/d' $f
done

효과가 있지만 더 잘할 수 있을까요?

답변1

고쳐 쓰다: gawk(v.3.1.8) 및 (v.1.3.3)에서 mawk단순화되고 테스트되었습니다.

이 awk 스크립트는 사용자가 요구하는 작업을 수행해야 합니다. 정규식 필드 구분 기호 및 레코드 구분 기호를 지원하는 다른 awk 구현과 함께 작동할 수 있습니다.

#!/usr/bin/awk -f

BEGIN {
  RS="}\n\n?"
  ORS="}\n"
  FS="\n"
  OFS="\n"
}

{
  # compress whitespace in first field
  gsub(/[ \t\n]+/," ",$1)

  # split remaining fields on whitespace
  for (i=2;i<=NF;i++) {
      gsub(/[ \t\n]+/,"\n",$i)
  }

  # remove double-newlines resulting from trailing whitespace
  gsub("\n\n+","\n",$0)

  print > NR".par"
}

입력으로 테스트하십시오 file.txt.

$ ./split.awk file.txt

그 다음에

$ cat 1.par
1_01 { ; quite good spirals 
reset=2000
type=mandel
passes=1
corners=-0.6014129278/-0.5990935452/0.427747516/0.429487053
params=0/0
float=y
maxiter=1000
inside=0
outside=15
distest=1/10/320/200
}

그리고

$ cat 3.par
1_03 { ; OK, bit dull, not zoomed in far 
reset=2000
type=mandel
passes=1
corners=0.3734922373/0.3820837907/-0.243292645/-0.23684898
params=0/0
float=y
maxiter=1000
inside=0
outside=15
distest=1/10/320/200
}

답변2

샘플 데이터를 ./file다음과 같이 넣었습니다.

cat >file <<\IN
# all of your example
IN 

그런 다음 다음을 수행했습니다.

sed -n 's|\([^ ]*\) *{.*|/\1 {/,/}/w file.\1.par|p' file | 
sed -e 's/  */ /g;s/^ //;s/ $//;/./!d;/{/!y/ /\n/' -f - file

하나의 프로세스를 사용하여 sed내부 파일에서 데이터를 잘라내고 이를 sed두 번째 sed프로세스에 사용할 수 있는 스크립트로 편집합니다.

최종 실행된 스크립트는 다음과 같습니다.

/1_01 {/,/}/w file.1_01.par
/1_02 {/,/}/w file.1_02.par
/1_03 {/,/}/w file.1_03.par
/1_04 {/,/}/w file.1_04.par

...하지만 그냥 실행됩니다뒤쪽에두 번째는 sed각 행에 대해 실행됩니다.문서...

... -e 's/  */ /g;s/^ //;s/ $//;/./!d;/{/!y/ /\n/' ...

...먼저 일련의 공백을 단일 공백으로 압축하고, 선행 또는 후행 공백이 여전히 존재하는 경우 제거하고, 출력에서 ​​빈 줄을 완전히 제거한 다음, 마지막으로 모든 공백을 \n줄당 일치하지 않는 ewline 문자로 변환합니다 {.

(section heading) *{.*따라서 두 번째 의식과 일치하는 모든 줄 번호와 모든 후속 줄( sed w입력에 나타나는 다음 줄 포함)에 대해 원래 입력 파일은 영향을 받지 않습니다.}file.(section heading)

달리고 나서 그랬는데...

cat <./file.1_01.par

...그리고...

1_01 { ; quite good spirals 
reset=2000
type=mandel
passes=1
corners=-0.6014129278/-0.5990935452/0.427747516/0.429487053
params=0/0
float=y
maxiter=1000
inside=0
outside=15
distest=1/10/320/200
}

실행하려면 sed ...이 두 줄을 터미널에 복사하여 붙여넣고 다음으로 바꾸세요.문서적합한 이름.

나도 시도했다협회귀하의 질문에 ...

sed -n 's|.\([^ ]*\) {.*|/\1 {/,/^}$/w \1.par|p' <<-IN |\ 
sed -e 's/.//;/{/!y/ /\n/' -f - all.par
    $(curl -s 'http://www.calresco.org/pic3/calres3.par' |
    tr -s '\r\n ' '\n  ' |tee all.par)
IN

모든 .par기능을 자체 파일로 분할하고 DOS 줄 끝을 처리합니다.

ls -C
a46.par       bugeyed.par  flocks.par    iconw2b.par   manchaos.par  swirl5.par
aciddrop.par  burr.par     galaxy.par    juliland.par  mandelzm.par  trific.par
all.par       complex.par  highrise.par  lace.par      redgiant.par
angfish.par   eyeeye.par   iconvolc.par  lavaflow.par  scythe.par

그것들은 모두 함수 이름을 따서 명명되었습니다.

cat galaxy.par

galaxy {;Chris Lucas
reset=1950
type=julia
center-mag=+0.03023290053994965/+0.26628255550711930/42.69126/1/67.5
params=-0.1582146627566066/0.6550294654497986
float=y
maxiter=30000
colors=000000GFF<28>x11z00z10<29>zx0zz0zz1<29>zzxzzzzzz<61>zV1zU0zU0zT0<\
28>z10z00z00y00<30>c00b11a11`22_22<25>FFF
}

답변3

csplit을 시도하십시오: 입력 파일 == frac.txt, 출력 파일 == frac[nn](여기서 파일 #00이 비어 있으므로 nn>00)

 csplit -f frac frac.txt /^1/ {*}

답변4

행 서식을 개별적으로 수행할 수 있습니다 sed.

sed -i 's/^\s*\|\s*$//g ; s/\s\s*/ /g ; /[{}]/!s/ /\n/g ; /^\s*$/d' *.txt

관련 정보