第一个文件是以含“NUM=”的行来排序,如下
TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}
TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}
TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}
TOOLS {
NUM=4
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}
TOOLS {
NUM=5
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}
第二个文件要以含“DRILL_SIZE=”来排序,并重组“NUM=”的那行,效果如下
TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}
TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}
TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}
TOOLS {
NUM=4
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}
TOOLS {
NUM=5
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}
谢谢老大了!
skycity0210 回复于:2005-11-16 20:08:08
好像只用awk有点不够用,awk的排序函数还不太会用,有哪位老大有好的思路?
dbcat 回复于:2005-11-16 22:07:24
cat -n file |sed -n '/.\{2\}\..\{10,\}$/p' | sort -t"=" -k2 | cut -f1 | xargs -i awk 'NR>{}- 10&&NR<{}+3{print}' file >tmp
seq 1 5 |xargs -i echo "NUM={}"|xargs -i sed 's/NUM\=[1-5]\{1\}$/{}/' tmp | awk '{k=0;while(k<6){if(NR < 60*k
+ 12*k +13 && NR > 60*k + 12*k ){print;}k++;}}'
$ seq 1 5 |xargs -i echo "NUM={}"|xargs -i sed 's/NUM\=[1-5]\{1\}$/{}/' tmp | awk '{k=0;while(k<6){if(NR < 60*k + 12*k +13 && NR > 60*k + 12*k ){print;}k++;}}'
TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}
TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}
TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}
TOOLS {
NUM=4
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}
TOOLS {
NUM=5
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}
[ 本帖最后由 dbcat 于 2005-11-16 22:26 编辑 ]
skycity0210 回复于:2005-11-16 22:14:40
谢谢老大了,能不能大概解释一下思路,看的有点晕,^_^
dbcat 回复于:2005-11-16 22:21:54
First,以含“DRILL_SIZE=”来排序:
cat -n file |sed -n '/.{2}..{10,}$/p' | sort -t"=" -k2 | cut -f1 | xargs -i awk 'NR>{}- 10&&NR<{}+3{print}' file >tmp
$cat tmp
TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}
TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}
TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}
TOOLS {
NUM=5
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}
TOOLS {
NUM=4
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}
Second,重组“NUM=”的那行a
seq 1 5 |xargs -i echo "NUM={}"|xargs -i sed 's/NUM=[1-5]{1}$/{}/' tmp | awk '{k=0;while(k<6){if(NR < 60*k + 12*k +13 && NR > 60*k + 12*k ){print;}k++;}}'
****ps:Shell Code Too long :mrgreen::mrgreen:
skycity0210 回复于:2005-11-16 22:31:16
seq 是什么命令?我用的c-shell,没见过seq,请老大指教!
代码实用就行^_^
dbcat 回复于:2005-11-16 22:35:29
csh............
This script is for bash ^_^
$seq 1 5
1
2
3
4
5
In csh try:
??
[ 本帖最后由 dbcat 于 2005-11-16 22:36 编辑 ]
技安 回复于:2005-11-16 22:53:08
awk ' BEGIN { FS="[\n=]" ; RS=""} { print $3 } ' a | sort -n > c
for i in `cat c ` ; do
awk ' BEGIN { FS="[\n=]" ; RS=""} { a[$3]=$0 } END { print a['$i'] } ' a
done
-------------------
如果 num 有相同的就不行了、、、,
[ 本帖最后由 技安 于 2005-11-16 22:55 编辑 ]
技安 回复于:2005-11-16 22:59:26
晕、我。。。。。。。。。。。。还以为、第一个文件,也是乱的呢。
技安 回复于:2005-11-16 23:08:25
awk -F= ' $1 ~ /DRILL_SIZE/ { print $2 } ' a | sort -n > c
for i in ` cat c ` ; do
awk ' BEGIN { FS="[\n=]" ; RS=""} { a[$19]=$0 } END { print a["'$i'"] } ' a
done
[ 本帖最后由 技安 于 2005-11-16 23:09 编辑 ]
skycity0210 回复于:2005-11-16 23:54:43
for i in ` cat c ` ; do
awk ' BEGIN { FS="[n=]" ; RS=""} { a[$19]=$0 } END { print a["'$i'"] } ' a
done
好像只是对/DRILL_SIZE/那行进行了排序
mocou 回复于:2005-11-17 00:01:11
cat file|xargs -n13|sed 's/NUM=/& /'|sort -k4n|sed 's/NUM= /NUM=/'|xargs -n1
cat file|xargs -n13|sed 's/DRILL_SIZE=/& /'|sort -k12n|sed 's/DRILL_SIZE= /DRILL_SIZE=/'|awk '{A++;gsub(/NUM=[0-9]+/,"NUM="A"",$3);print}'|xargs -n1
skycity0210 回复于:2005-11-17 00:09:13
版主厉害,能否介绍一思路?是不是先将文件每13行转成1行后排序,再重组?
能否解释下awk的那段,不太理解,谢谢了!
mocou 回复于:2005-11-17 08:48:05
引用:原帖由 skycity0210 于 2005-11-17 00:09 发表
版主厉害,能否介绍一思路?是不是先将文件每13行转成1行后排序,再重组?
能否解释下awk的那段,不太理解,谢谢了!
是的,其实你分段执行一下就知道思路了
awk这段的意思就是用1-5分别替换每一行的NUM值
skycity0210 回复于:2005-11-18 00:20:37
谢谢版主了,不过如果是处理比较大的文件,比如有100多行的话,速度可能有点慢了。^_^
寂寞烈火 回复于:2005-11-18 02:45:29
/home/lee#n=1;for i in $(grep -o '[0-9][0-9].[0-9]*' file.txt|sort -n);do
> awk 'BEGIN{RS=ORS=""}/'"$i"'/{sub(/NUM=[0-9]/,"NUM='"$n"'");print $0,"\n\n"}' file.txt
> ((n++));done 引用:
TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}
TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}
TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}
TOOLS {
NUM=4
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}
TOOLS {
NUM=5
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}
BTW:论坛怎么还没解决斜线问题!!!
[ 本帖最后由 寂寞烈火 于 2005-11-18 03:05 编辑 ]
waker 回复于:2005-11-18 08:57:03
awk可能不够
但gawk够了吧?
gawk 'BEGIN {FS="=";i=1}
{a=a"n"$0}
/DRILL_SIZE/{b[$2]=i}
/^ *$/{i++}
END {asorti(b,c)
for(j=1;j<=i;j++){
sub(/NUM=[0-9]*\n/,"NUM="j"\n",a[b[c[j]]])
print a[b[c[j]]]}
}' file
waker 回复于:2005-11-18 10:24:16
感谢mocou版本的验证
上面那个要求 gnu awk version 3.1.2以上
下面这个要求3.1 :mrgreen:
gawk 'BEGIN {FS="=";i=0}
/SHAPE/,/SLOT/{a=a"\n"$0}
/DRILL_SIZE/{b[$2]=i;c=$2}
/^TOOLS/{i++}
END {asort(c)
for(j=1;j<=i;j++){print "TOOLS {\n NUM="j a[b[c[j]]]"\n}\n"}}' file
[ 本帖最后由 waker 于 2005-11-18 10:32 编辑 ]
flw 回复于:2005-11-18 13:44:34
我也写一个。
perl -e '$/="}\n\n";@l=<>;print map {s/NUM=\d/"NUM=".($i+++1)/me;$_} sort {($a=~/DRILL_SIZE=([\d\.]+)/m)[0]<=>($b=~/DRILL_SIZE=([\d.]+)/m)[0]} @l' file
我把我的分析一下:(谁不分析自己写的,我 BS 他!)
perl -e '
$/ = "}\n\n";
@lines = <>;
print map {
s/NUM=\d/"NUM=".($i+++1)/me;
$_
}sort{
($a =~ /DRILL_SIZE=([\d\.]+)/m)[0]
<=>
($b =~ /DRILL_SIZE=([\d\.]+)/m)[0]
} @lines
' file
思路很简单。
先用 $/ 设定一个记录分隔符。(默认是以行分割,但是那样太难处理了。)
然后读取所有的记录到 @lines 里面。
紧接着就开始处理。
先按照 DRILL_SIZE 后面的数字排序,
然后把排序结果用 map 替换一下,把 NUM 后面的数字重填。
[ 本帖最后由 flw 于 2005-11-18 14:30 编辑 ]
flw 回复于:2005-11-18 14:06:11
死 waker,你的 190 个字节,我的 160 个字节,我的比你的短哦~
赶紧给我加个小手 :D :D :D
[ 本帖最后由 flw 于 2005-11-18 14:13 编辑 ]
mocou 回复于:2005-11-18 14:07:05
哼哼,算你们牛 :em10:
寂寞烈火 回复于:2005-11-18 14:11:48
引用:原帖由 flw 于 2005-11-18 14:06 发表
死 waker,你的 190 个字节,我的 177 个字节,我的比你的短哦~
赶紧给我加个小手 :D :D :D
你的比我的长 :em11: 我才164
flw 回复于:2005-11-18 14:14:30
引用:原帖由 寂寞烈火 于 2005-11-18 14:11 发表
你的比我的长 :em11: 我才164
我刚才去掉了所有的空格,现在只剩下 160 啦。
HonestQiao 回复于:2005-11-18 14:16:56
引用:原帖由 flw 于 2005-11-18 14:14 发表
我刚才去掉了所有的空格,现在只剩下 160 啦。
BT :em02:
我手工,没有长度
flw 回复于:2005-11-18 14:18:12
引用:原帖由 寂寞烈火 于 2005-11-18 14:11 发表
你的比我的长 :em11: 我才164
我刚才又把变量名改短了些,现在是 152 个字符了。
寂寞烈火 回复于:2005-11-18 14:19:00
引用:原帖由 flw 于 2005-11-18 14:14 发表
我刚才去掉了所有的空格,现在只剩下 160 啦。
:em10::em10:
mocou 回复于:2005-11-18 14:22:04
应该比效率,处理一个大文件,看谁的快 :em02:
flw 回复于:2005-11-18 14:23:56
引用:原帖由 mocou 于 2005-11-18 14:22 发表
应该比效率,处理一个大文件,看谁的快 :em02:
比效率我就不这么写了。我用 C!哈哈……
flw 回复于:2005-11-18 14:24:50
引用:原帖由 寂寞烈火 于 2005-11-18 14:19 发表
:em10::em10:
表哭嘛!
其实你也有很多空格可以去掉的嘛!
HonestQiao 回复于:2005-11-18 15:12:01
[color=#003300]我也来一个,虽然我的比你长,但是我得思路更加的清晰:
[color=#003300]
问题: 文件要以含“DRILL_SIZE=”来排序,并重组“NUM=”的那行
[size=20][color=#FF0000]数据文件file[/color][/size]
TOOLS {
NUM=0
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}
TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}
TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}
TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}
TOOLS {
NUM=4
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}
[size=20][color=#FF0000]PHP命令行代码[/color][/size]
php -r'$f=file_get_contents(file);preg_match_all("/\\TOOLS {.+?DRILL_SIZE=([\\d\\.]+).+?\\}/s",$f,$a);asort($a[1]);foreach($a[1] as $k=>$v)echo preg_replace("/(?<=NUM=)\\d+/",++$i,$a[0][$k])."\\n";'
[size=20][color=#FF0000]PHP代码分析[/color][/size]
<?php
/// php -r'$f=file_get_contents(file);preg_match_all("/\\TOOLS {.+?DRILL_SIZE=([\\d\\.]+).+?\\}/s",$f,$a);asort($a[1]);foreach($a[1] as $k=>$v)echo preg_replace("/(?<=NUM=)\\d+/",++$i,$a[0][$k])."\n";'
/// 读取文件内容
$f=file_get_contents("e:\\usr\\local\\www\\work\\data.txt");
/// 匹配每一个TOOLS { ... } 的部分,同时匹配DRILL_SIZE=...的部分
preg_match_all("/\\TOOLS {.+?DRILL_SIZE=([\\d\\.]+).+?\\}/s",$f,$a);
/// 查看数组$a的结构
echo('查看数组$a的结构n');
var_export($a);
/// 排序数组$a的子数组$a[1],并保留hash索引
asort($a[1]);
echo('查看数组$a的结构,此时$a[1]已经排序n');
/// 查看数组$a的结构,此时$a[1]已经排序
var_export($a);
echo('遍历$a[1],并输出$a[0]对应的项,同时递增替换NUM=...n');
/// 遍历$a[1],并输出$a[0]对应的项,同时递增替换NUM=...
foreach($a[1] as $k=>$v) echo preg_replace("/(?<=NUM=)\\d+/",++$i,$a[0][$k])."\n";
?>
[size=20][color=#FF0000]PHP代码调试结果[/color][/size]
---------- PHP代码调试 ----------
Content-type: text/html
X-Powered-By: PHP/4.3.10
查看数组$a的结构narray (
0 =>
array (
0 => 'TOOLS {
NUM=0
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}',
1 => 'TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}',
2 => 'TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}',
3 => 'TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}',
4 => 'TOOLS {
NUM=4
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}',
),
1 =>
array (
0 => '45.2755905511811',
1 => '17.71653543307087',
2 => '27.55905511811024',
3 => '33.46456692913386',
4 => '41.33858267716536',
),
)查看数组$a的结构,此时$a[1]已经排序narray (
0 =>
array (
0 => 'TOOLS {
NUM=0
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}',
1 => 'TOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}',
2 => 'TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}',
3 => 'TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}',
4 => 'TOOLS {
NUM=4
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}',
),
1 =>
array (
1 => '17.71653543307087',
2 => '27.55905511811024',
3 => '33.46456692913386',
4 => '41.33858267716536',
0 => '45.2755905511811',
),
)遍历$a[1],并输出$a[0]对应的项,同时递增替换NUM=...nTOOLS {
NUM=1
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=12
DRILL_SIZE=17.71653543307087
SLOT_LENGTH=0
}
TOOLS {
NUM=2
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=22
DRILL_SIZE=27.55905511811024
SLOT_LENGTH=0
}
TOOLS {
NUM=3
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=28
DRILL_SIZE=33.46456692913386
SLOT_LENGTH=0
}
TOOLS {
NUM=4
SHAPE=HOLE
TYPE=PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=35
DRILL_SIZE=41.33858267716536
SLOT_LENGTH=0
}
TOOLS {
NUM=5
SHAPE=HOLE
TYPE=NON_PLATED
TYPE2=STANDARD
MIN_TOL=3.15
MAX_TOL=3.15
BIT=
FINISH_SIZE=40
DRILL_SIZE=45.2755905511811
SLOT_LENGTH=0
}
输出完成 (耗时 0 秒) - 正常终止
[/color]
[ 本帖最后由 HonestQiao 于 2005-11-18 15:24 编辑 ]
flw 回复于:2005-11-18 15:15:09
楚楚你太 BT 了。
建议你把 php 放一放。
垃圾语言。
不如 Perl。
HonestQiao 回复于:2005-11-18 15:16:19
引用:原帖由 flw 于 2005-11-18 15:15 发表
楚楚你太 BT 了。
建议你把 php 放一放。
垃圾语言。
不如 Perl。
思路开拓一点啊,都是为了解决问题。
flw 回复于:2005-11-18 15:17:27
引用:原帖由 HonestQiao 于 2005-11-18 15:16 发表
思路开拓一点啊,都是为了解决问题。
sorry,我刚才措辞失当。
不过 php 的确在设计理念上和 Perl 有很大的不同。
请看下面:
* 参数和返回值极其矛盾
* PHP对大小写不敏感的操作使用不同的函数
* PHP的函数命名方式的不一致
* PHP没有词法范围
* PHP的主名空间中函数太多
* PHP缺少抽象令 TIMTOWTDI 走向糟糕的极端
* 更多信息
[ 本帖最后由 flw 于 2005-11-18 15:20 编辑 ]
flw 回复于:2005-11-18 15:21:58
参数和返回值极其矛盾
要展示这个问题,下面有一个函数列表,里面的函数用来匹配用户定义的内容:(也许甚至那些用PHP的人才会使用这个文档,只是用来查看该用哪个函数:P)
匹配 替换使用 大小写不敏感 返回的数字 数组参数 返回匹配 s/m/x标志 偏移(-1=结尾)
ereg ereg 否 所有 否 数组 无 0
ereg_replace ereg 字符串 否 所有 否 无 无 0
eregi ereg 否 所有 否 数组 无 0
eregi_replace ereg 字符串 否 所有 否 无 无 0
mb_ereg ereg[1] 否 所有 否 数组 无 0
mb_ereg_replace ereg[1] 字符串/表达式 否 所有 否 无 有 0
mb_eregi ereg[1] 否 所有 否 数组 无 0
mb_eregi_replace ereg[1] 字符串 否 所有 否 无 无 0
preg_match preg[2] 皆可 一个 否 数组 有 0
preg_match_all preg 皆可 所有 否 数组 有 0
preg_replace preg 字符串/表达式 皆可 无/所有 是 无 有 0
str_replace str 字符串 否 所有 是 数字 无 0
str_ireplace str 字符串 是 所有 是 数字 无 0
strstr, strchr str 否 一个 否 子串 无 0
stristr str 是 一个 否 子串 无 0
strrchr str 否 一个 否 子串 无 -1
strpos str 否 一个 否 索引 无 n
stripos str 是 一个 否 索引 无 n
strrpos char[3] 否 一个 否 索引 无 n
strripos str 是 一个 否 索引 无 -1
mb_strpos str[1] 否 一个 否 索引 无 n
mb_strrpos str[1] 否 一个 否 索引 无 -1
这种问题还存在在其他的函数组里,不仅仅是匹配的这部分而已。
(在Perl中,所有这些功能都可以通过四个简单的操作符来完成。)
[1] 用于处理多字节字符
[2] PCRE regex: 所谓的“Perl兼容”的正则表达式。
[3] 在PHP5中也是字符串str
flw 回复于:2005-11-18 15:22:59
PHP对大小写不敏感的操作使用不同的函数
(这个可能会有两方面的争论。有些人认为提供不同的函数更好,即使这意味着又要记很多名词了)
在Perl中,你可以使用两个lc() 或者是 /i 标志,而PHP通常会提供一个大小写敏感的变量。而且,大小写不敏感的那些版本的函数名的命名方式也不一致。
Perl: $foo cmp $bar lc $foo cmp lc $bar
PHP: strcmp($foo, $bar) strcasecmp($foo, $bar)
Perl: index($foo, $bar) index(lc $foo, lc $bar)
PHP: strpos($foo, $bar) stripos($foo, $bar)
Perl: $foo =~ s/foo/bar/ $foo =~ s/foo/bar/i
PHP: $foo = str_replace('foo', 'bar', $foo) $foo = str_ireplace(...)
PHP: $foo = ereg_replace('foo', 'bar' ,$foo) $foo = eregi_replace(...)
PHP的函数命名方式的不一致
* 大小写不敏感的函数有一个'i'或者'case'在函数名的不同的位置。
flw 回复于:2005-11-18 15:23:45
* 毫无表现上的规律 有下划线的 和 没下划线的:
下划线 无下划线:
stream_get_line readline
disk_free_space diskfreespace
is_object isset
mcal_day_of_week jddayofweek
set_error_handler setlocale
snmp_get_quick_print snmpget
get_browser getallheaders
base64_encode urlencode
image_type_to_mime_type imagetypes
msql_num_fields mysql_numfields
php_uname phpversion
strip_tags stripslashes
bind_textdomain_codeset bindtextdomain
cal_to_jd gregoriantojd
str_rot13 strpos
Perl的核心函数名则没有含有下划线的。
* PHP 有 unlink 、link 和 rename 和系统调用一致,但是 touch 的系统调用是 utime, 不是 touch。
* 同时你也无法确定单词的顺序:
o 宾语 动词:base64_decode, iptcparse, str_shuffle, var_dump
o 动词 宾语:create_function, recode_string
Perl的核心函数都是“动词 宾语”结构的除了替代的 dbm* 函数。(注意里面的 sys 是一个前缀,而不是一个宾语。同时 flock 和 lstat 是根据系统调用命名的。shm* 和 msg* 是库函数调用)
* "to" 还是 "2"?
ascii2ebcdic, bin2hex, deg2rad, ip2long, cal_to_jd (jdto*, *tojd), strtolower, strtotime,
flw 回复于:2005-11-18 15:24:39
PHP没有词法范围
Perl 有词法范围和动态范围。PHP则没有。
对于为什么词法范围很重要的解释,可以参考 Coping with Scoping.
PHP Perl
超全局(Superglobal) 有 有[1]
全局(global) 有 有
函数局部 有 有
词法域(块局部) 无 有
动态域 无 有
[1] Perl有一些变量总是在main:: 命名空间中。这些类似于PHP的超全局变量。
[2] 在子过程的块中使用一个词法变量,就可以作为一个函数的局部变量。
flw 回复于:2005-11-18 15:25:06
PHP的主名空间中函数太多
(使用编译了所有核心分发包中的可用扩展的核心库,我们使用了2003年11月发布的版本)
PHP 主要函数的数量:3079 [1]
Perl主要函数的数量:206 [2]
中值PHP 函数名长度:13
平均PHP 函数名长度:13.67
中值Perl函数名长度:6
平均Perl函数名长度:6.22
注意,Perl的一些函数有简短的等价语法:
readpipe('ls -l') ==> `ls -l`
glob('*.txt') ==> <*.txt>
readline($fh) ==> <$fh>
quotemeta($foo) ==> "Q$foo"
lcfirst($foo) ==> "l$foo" (lc is L)
ucfirst($foo) ==> "u$foo" (uc is U)
[1] 来源:PHP Quick Reference
[2] 来源:perldoc perlfunc
flw 回复于:2005-11-18 15:26:22
Perl 用更少的函数、更简洁的语法,做了更多的事。用户不用再记忆太多的函数。
PHP: (14)
dbx_escape_string, escapeshellarg, escapeshellcmd, pg_escape_bytea,
pg_escape_string, pg_unescape_bytea, addslashes, addcslashes, preg_quote,
quotemeta, mysql_escape_string, mysql_real_escape_string,
mysqli_real_escape_string, sqlite_escape_string
o
Perl: (2) [1]
quotemeta, $dbh->quote
*
排序:
o
PHP: (16)
sort, arsort, asort, krsort, ksort, natsort, natcasesort, rsort, usort,
array_multisort, uasort, uksort, dbx_sort, imap_sort, ldap_sort, yaz_sort
o
Perl: (1)
sort
*
遍历列表:
o
PHP: (10)
array_filter, preg_grep, array_search, array_unique, in_array, array_map,
array_walk, array_count_values, array_change_key_case, array_sum
o
Perl: (2)
map, grep
*
分割:
o
PHP: (8)
split, explode, strtok, spliti, chunk_split, mb_split, preg_split,
str_split
o
Perl: (1)
split
*
匹配:
o
字符串:
+
PHP: (11)
strstr, strchr, stristr, strpos, strrchr, stripos, mb_strpos,
mb_strrpos, strrpos, strripos, substr
+
Perl: (3)
index, rindex, substr
o
正则表达式:
+
PHP: (6)
ereg, eregi, mb_ereg, mb_eregi, preg_match, preg_match_all
+
Perl: (1)
m//
*
替换匹配部分:
* PHP: (12)
ereg_replace, eregi_replace, mb_ereg_replace, mb_eregi_replace,
preg_replace, str_ireplace, str_replace, ltrim, rtrim, trim, nl2br
* Perl: (1)
s///
*
连接到数据库:
o
PHP: (17 或更多)
dbx_connect, fbsql_connect, ibase_connect, msql_connect, msql_pconnect,
mssql_connect, mysql_connect, odbc_connect, pg_connect, pg_pconnect,
sesam_connect, ifx_pconnect, ifx_connect, sqlite_open, sqlite_popen,
mysqli_connect, mysqli_pconnect
o
Perl: (2)
DBI->connect, DBI->connect_cached
*
打开(文件、进程等):
o
PHP: (5)
dio_open, fopen, proc_open, popen, gzopen[2]
o
Perl: (2)
open, sysopen
*
读取/接收:
o
PHP: (12)
dio_read, fread, gzread[2], socket_read, socket_recv, socket_recvfrom,
socket_recvmsg, readline, fgetc, fgets, stream_get_line, file
o
Perl: (5)
read, readline, sysread, recv, getc
*
打印/输出/写入:
o
PHP: (14)
print, echo, printf, fprintf, vprintf, dio_write, fwrite, fputs,
gzwrite[2], socket_send, socket_sendmsg, socket_sendto, socket_write,
socket_writev
o
Perl: (5)
print, printf, syswrite, send, write
*
关闭:
o
PHP: (7)
closelog, dio_close, fclose, gzclose[2], pclose, socket_close,
proc_close
o
Perl: (1)
close
*
常用/工具:
o
PHP:
array_combine, array_fill, array_flip, array_merge, list, range, count,
create_function, strtr, pow, putenv, getenv, getmygid, getmypid, getmyuid
o
Perl:
使用语法或者魔术变量
HonestQiao 回复于:2005-11-18 15:27:43
你说的很有道理。
不过php我继续用,perl我也继续用。
条条大道通罗马,365行行行出状元。
他们都很好用。
他们都是我的工具,我是他们的主人,我不是他们的奴隶。
[ 本帖最后由 HonestQiao 于 2005-11-18 15:28 编辑 ]
flw 回复于:2005-11-18 15:28:40
上述摘抄为译文,原文请参见:
http://www.tnx.nl/php
flw 回复于:2005-11-18 15:31:31
引用:原帖由 HonestQiao 于 2005-11-18 15:27 发表
你说的很有道理。
不过php我继续用,perl我也继续用。
条条大道通罗马,365行行行出状元。
他们都很好用。
他们都是我的工具,我是他们的主人,我不是他们的奴隶。
工欲善其事,必先利其器。
他们也都是我的工具,不过我喜欢用正确的工具做正确的事。好比 PHP 的 CLI,实在不值一晒,因为不知道优点/长处在哪儿?
好比今天这个题目,用 php 做起来就太不划算了。
dbcat 回复于:2005-11-18 16:10:14
引用:原帖由 flw 于 2005-11-18 14:18 发表
我刚才又把变量名改短了些,现在是 152 个字符了。
cat -n file|sed -n '/\..\{8,\}$/p'|sort -t"=" -k2|cut -f1|xargs -i awk 'NR>{}-10&&NR<{}+3' file|sed '/N/{y$3254$2345$}'
120 !:mrgreen:
[ 本帖最后由 dbcat 于 2005-11-18 16:11 编辑 ]
flw 回复于:2005-11-18 16:13:58
引用:原帖由 dbcat 于 2005-11-18 16:10 发表
cat -n file|sed -n '/..{8,}$/p'|sort -t"=" -k2|cut -f1|xargs -i awk 'NR>{}-10&&NR<{}+3' file|sed '/N/{y$3254$2345$}'
120 !:mrgreen:
[flw@BuildServer shell]$ cat -n file|sed -n '/\..\{8,\}$/p'|sort -t"=" -k2|cut -f1|xargs -i awk 'NR>{}-10&&NR<{}+3' file|sed '/N/{y$3254$2345$}'
sed: -e expression #1, char 17: extra characters after command
xargs: awk: terminated by signal 13
dbcat 回复于:2005-11-18 16:17:10
sed --version 4.05
awk --version 3.1.1
flw 回复于:2005-11-18 16:21:40
哈哈!
刚才看了一下你的思路,你的程序是错的哦~
是用眼睛算出来的!
[ 本帖最后由 flw 于 2005-11-18 16:23 编辑 ]
dbcat 回复于:2005-11-18 16:27:48
是吗?
na结果ne?
man sed
y/source/dest/
Transliterate the characters in the pattern space which appear
in source to the corresponding character in dest.
dbcat 回复于:2005-11-19 18:06:33
引用:原帖由 flw 于 2005-11-18 16:21 发表
哈哈!
刚才看了一下你的思路,你的程序是错的哦~
是用眼睛算出来的!
hehe,maybe u r right..........
:mrgreen:
Look at this one:
file p2:
grep -n DR f|sort -k2|cut -d: -f1|xargs -i awk 'NR<{}+3&&NR>{}-10' f>t;grep U t|cut -d= -f2|tr "n"
"|"|xargs -i sed '/N/{y!{}!1|2|3|4|5|!}' t
And the more tricky one:
file p1
grep -n DR f|sort -k2|cut -d: -f1|xargs -i awk 'NR<{}+3&&NR>{}-10' f|sed '/N/{y$3254$2345$}'
$ ls -l p1 p2
-rw-r--r-- 1 tory ruleno1 93 Apr 11 21:04 p1
-rw-r--r-- 1 tory ruleno1 143 Apr 11 21:05 p2
:em02::em02::em02:
思路:
First sort the fields by DRILL_SIZE:
grep -n DR file|sort -k2|cut -d: -f1|xargs -i awk 'NR<{}+3&&NR>{}-10' file
Second change the NUM=? fields
waker 回复于:2005-11-21 08:28:12
呵呵,flw所说的眼睛算是指sed 'y///'的部分
dbcat 回复于:2005-11-21 08:42:28
grep -n DR f|sort -k2|cut -d: -f1|xargs -i awk 'NR<{}+3&&NR>{}-10' f>t;grep U t|cut -d= -f2|tr "\n"
"|"|xargs -i sed '/N/{y![color=Red]{}[/color]!1|2|3|4|5|!}' t
:mrgreen:
|