免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4071 | 回复: 7

[其他] shell读取一个文件并循环执行程序的写法 [复制链接]

论坛徽章:
0
发表于 2016-09-02 07:28 来自手机 |显示全部楼层
有一个文件a.txt,内容是:
LAYOUT PATH "./pv/gds/xcell.db"
RUN RESULT "xcell.summary"
RUN DONE

另一个文件cell.list,内容是:
acell
bcell
ccell

现在要用csh写一个运行程序,读取cell.list文件,然后把a.txt里面的xcell依次替换成acell,bcell,ccell,每次替换完成保存下然后作为输入并执行下一条命令:calibre -drc a.txt,请问程序怎么写呀?

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2016-10-26 14:32:57
发表于 2016-09-02 14:05 |显示全部楼层
本帖最后由 StarWingsss 于 2016-09-02 14:37 编辑

vi 1.sh

#!/bin/bash

n=0
i=1
line_num=$(cat cell.list|wc -l)  ##行数不确定,用这个统计需要更换词语的次数

while [ $i -le 3 ]
do
   a[$n]=$(awk -v b=$i '{if(NR==b) print}' cell.list)
   awk -v c=${a[$n]} '{gsub("xcell",c,$0);print}' a.txt > test.txt
   i=`expr $i + 1`
   n=`expr $n + 1`
done
calibre -drc a.txt
exit 0

如果转换有问题,例如acell.db没有了.db
请使用
dos2unix cell.list
dos2unix a.txt 后再使用这个shell

论坛徽章:
0
发表于 2016-09-02 22:00 |显示全部楼层

你好,我发现定义的line_num没有用阿?另外 while里面定义了 i<3?

我把完整的贴出来。

vi a.txt:

//
//  Rule file generated on Thu Sep 01 22:51:43 CST 2016
//     by Calibre Interactive - DRC (v2015.4_16.11)
//
//      *** PLEASE DO NOT MODIFY THIS FILE ***
//
//

LAYOUT PATH  "./pv/gds/xcell.calibre.db"
LAYOUT PRIMARY "adiodeV5"
LAYOUT SYSTEM GDSII

DRC RESULTS DATABASE "./pv/drc/xcell.drc.results" ASCII
DRC MAXIMUM RESULTS 1000
DRC MAXIMUM VERTEX 4096

DRC CELL NAME YES CELL SPACE XFORM
DRC SUMMARY REPORT "./pv/drc/xcell.drc.summary" REPLACE HIER

VIRTUAL CONNECT COLON NO
VIRTUAL CONNECT REPORT NO

DRC ICSTATION YES


INCLUDE "/data/pdk/Calibre/drc/cal.drc"


vi cell.list
acell
bcell
ccell

说明:这个cell.list会不断的添加名字,所以最好不要写死行数,不知道可行不可行。a.txt文件内容是固定的,就是每次要用cell.list里面每一行的名字代替a.txt里面的xcell就行,然后保存作为一个config文件,用来运行calibre -drc a.txt,cell.list有多少行,这个命令就循环运行多少次。再次感谢!

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-09-02 23:44 |显示全部楼层
回复 1# minzyyl

check by yourself and modify ...

cat tmp.txt  ==> calibre -drc tmp.txt


$ awk 'FNR==NR{a[NR]=$1;t=NR;next}{F[FNR]=$0}END{for(m=1;m<=t;++m){f="tmp.txt";for(n=1;n<=FNR;++n){s=F[n];gsub("xcell",a[m],s);print s > f}close(f);system("cat tmp.txt")}}' cell.list a.txt
LAYOUT PATH "./pv/gds/acell.db"
RUN RESULT "acell.summary"
RUN DONE
LAYOUT PATH "./pv/gds/bcell.db"
RUN RESULT "bcell.summary"
RUN DONE
LAYOUT PATH "./pv/gds/ccell.db"
RUN RESULT "ccell.summary"
RUN DONE

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2016-10-26 14:32:57
发表于 2016-09-03 19:54 |显示全部楼层
本帖最后由 StarWingsss 于 2016-09-03 20:00 编辑

回复 3# minzyyl

##因为你的cell.list有三行,所以我在while定义了3如果你cell.list有n行,就用line_num来统计并且用$line_num替换while里面的3
##假设cell.list有多行
vi 1.sh

#!/bin/bash

n=0
i=1
line_num=$(cat cell.list|wc -l)  ##行数不确定,因此用这个统计需要更换xcell需要被替换的次数

while [ $i -le $line_num ]
do
   a[$n]=$(awk -v b=$i '{if(NR==b) print}' cell.list)
   awk -v c=${a[$n]} '{gsub("xcell",c,$0);print}' a.txt >> test.config  ##把替换的结果保存为test.config,可以自定义名称
   i=`expr $i + 1`
   n=`expr $n + 1`
donecalibre -drc test.config   ##这个不确定你的需求,你这个确认
exit 0
##因为你最后应该是要运行calibre -drc a.txt命令,其实是运行替换好的文件吧?
那你应该在exit 0 前面calibre -drc test.config


论坛徽章:
0
发表于 2016-09-03 21:52 |显示全部楼层
回复 5# StarWingsss

每替换后运行一次calibre这个命令。有N行就会运行N次,如果中间生成的a.txt文件也有N个,那最后都删除,只留最初始的这个。

论坛徽章:
0
发表于 2016-09-03 22:05 |显示全部楼层
回复 5# StarWingsss

可以工作了,谢谢了哈!!!

论坛徽章:
0
发表于 2016-09-03 22:05 |显示全部楼层
回复 4# jason680

谢谢哈,可以的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP