我有一个文本文件喜欢 :
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) 和mawk
(v.1.3.3)中进行了简化和测试
这个 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]
(其中 nn>00,因为文件 #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