+ -
当前位置:首页 → 问答吧 → 求助!多个有规律文件名合并的问题...

求助!多个有规律文件名合并的问题...

时间:2011-04-20

来源:互联网

有如下有规则的文件名:
ls:

obj_1_AB_1.30010578
obj_1_AB_1.30011321
obj_1_AB_1.30007541
obj_2_DE_1.30011122
obj_2_DE_2.30062001
obj_3_FA_1.30013520
obj_4_GI_1.30050026
obj_4_GI_2.30080100
.......
.......
obj_21_UO_1.30072990
obj_21_UO_2.30015980
obj_21_UO_3.30020015
obj_21_UO_4.30015620
obj_21_UO_5.30090121
==============================

想把它们合并:例如:
obj_1_AB_1.30010578
obj_1_AB_1.30011321
obj_1_AB_1.30007541 合并成:obj_1_AB.300

obj_2_DE_1.30011122
obj_2_DE_2.30062001  合并成:obj_2_DE.300

依次类推,把它们合并后得到文件名:
obj_1_AB.300
obj_2_DE.300
obj_3_FA.300
obj_4_GI.300
.......
.......
obj_21_UO.300

想用awk来做,该如何实现呢?一点思路都没有啊!请高人指点指点,谢谢大家!

作者: xiao_lin   发布时间: 2011-04-20

忘了说明一点,按照上述要求,是将文件内容合并后生成一个文件,谢谢大家了

作者: xiao_lin   发布时间: 2011-04-20

本帖最后由 yinyuemi 于 2011-04-20 14:40 编辑

回复 xiao_lin 晕,看错了

作者: yinyuemi   发布时间: 2011-04-20

回复 xiao_lin


    试试这个:
  1. awk '{file=gensub(/([^.]*)\.(...).*/,"\\1.\\2",1,FILENAME);print >file}'  *
复制代码

作者: yinyuemi   发布时间: 2011-04-20

楼上没关系,谢谢您回复,期待您的解答,谢谢

作者: xiao_lin   发布时间: 2011-04-20

awk -F '[_.]' '{a[$1"_"$2"_"$3"."substr($5,1,3)]}END{for (j in a) print j}' file

作者: ywlscpl   发布时间: 2011-04-20

回复 xiao_lin


    貌似我又理解错了,你是想合并文件,还是只是处理这几个文件名

作者: yinyuemi   发布时间: 2011-04-20

本帖最后由 ywlscpl 于 2011-04-20 14:57 编辑

回复 yinyuemi


貌似我也理解错了?

作者: ywlscpl   发布时间: 2011-04-20

是想把文件合并生成指定的文件名,例如:

obj_1_AB_1.30010578
obj_1_AB_1.30011321
obj_1_AB_1.30007541 合并成:obj_1_AB.300

obj_2_DE_1.30011122
obj_2_DE_2.30062001  合并成:obj_2_DE.300

obj_3_FA_1.30013520  只有一个文件,那就变成 obj_3_FA.300好了

依次类推,谢谢了

作者: xiao_lin   发布时间: 2011-04-20

回复 xiao_lin


    如果是合并文件的话,可以试试,
awk '{file=gensub(/([^.]*)\.(...).*/,"\\1.\\2",1,FILENAME);print >file}'  obj*

作者: yinyuemi   发布时间: 2011-04-20

another way
  1. ls obj* | awk -F '[_.]' '{while (getline l < $0) print l >$1"_"$2"_"$3"."substr($5,1,3)}'
复制代码

作者: ywlscpl   发布时间: 2011-04-20

膜拜高手。。。学习了

作者: qinyudd   发布时间: 2011-04-20

回复 ywlscpl


    学习学习!

作者: yinyuemi   发布时间: 2011-04-20



QUOTE:
another way
ywlscpl 发表于 2011-04-20 15:07




大哥~不行呀!提示:

awk: Syntax error
         at line 1 of program << {while (getline 1 < ... >>
context is
         {while (getline 1 < $0  ) print 1 > >>>  $1"_" <<<
awk: illegal statement
          at line 1 of program << {while (getline 1 < ... >>
awk: bailing out
           at line 1 of program << {while (getline 1 < ... >>


还请您多多费心,谢谢

作者: xiao_lin   发布时间: 2011-04-20

回复 xiao_lin


莫非你是sco unix系统

作者: ywlscpl   发布时间: 2011-04-20

是SCO,要是awk在SCO不行,用其它脚本也行呀!谢谢您

作者: xiao_lin   发布时间: 2011-04-20

回复 xiao_lin
  1. ls obj* | awk -F '[_.]' '{while (getline l < $0) {n=$1"_"$2"_"$3"."substr($5,1,3);print l >n}}'
复制代码
  1. awk '{split(FILENAME,m,"[_.]");n=m[1]"_"m[2]"_"m[3]"."substr(m[5],1,3);print >n}' obj*
复制代码

作者: ywlscpl   发布时间: 2011-04-20



QUOTE:
回复  xiao_lin
ywlscpl 发表于 2011-04-20 15:58




    awk '{split(FILENAME,m,"[_.]");n=m[1]"_"m[2]"_"m[3]"."substr(m[5],1,3);print >n}' obj*

您太厉害了,这条完全符合要求,崇拜,感谢您热心回复,谢谢!

作者: xiao_lin   发布时间: 2011-04-20