나는 가지고있다텍스트 파일좋다:
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