首页 > 学技术 > 技术网文 > Linux Shell > 正文

[保留] 谁能帮我处理如下的文件?(以文件的某一行排序后重组)谢谢了!!


来源 chinaunix.net 酷勤网整理

第一个文件是以含“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:




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=650136
转载请注明作者名及原文出处



收藏本页到: