SimpleDateFormat sdfParse = new SimpleDateFormat(”MMMMM dd, yyyy”, Locale.ENGLISH);
SimpleDateFormat sdfFormat = new SimpleDateFormat(”yyyy-MM-dd”);
SimpleDateFormat comFormat = new SimpleDateFormat(”yyyyMMdd”);
long start = System.currentTimeMillis();
Config.init(”app.properties”);
//prepare db
StringBuilder sql = null;
Statement st = null;
Connection conn = null;
try{
Class.forName(Config.get(”DB_DRIVER”)).newInstance();
conn = DriverManager.getConnection(Config.get(”DB_DSN”), Config.get(”DB_USERNAME”), Config.get(”DB_PASSWORD”));
st = conn.createStatement();
}catch(InstantiationException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
//change timezone
Calendar calendar = GregorianCalendar.getInstance();
int millisDiff = TimeZone.getTimeZone(Config.get(”TZ_DATA”)).getRawOffset() - TimeZone.getDefault().getRawOffset();
calendar.setTimeInMillis(calendar.getTimeInMillis()+millisDiff);
Calendar calYesterday = (Calendar)calendar.clone();
calYesterday.add(Calendar.DAY_OF_YEAR, -1);
Calendar calLastWeekDay = (Calendar)calYesterday.clone();
calLastWeekDay.add(Calendar.DAY_OF_YEAR, - Integer.parseInt(Config.get(”OFFSET_DAYS”)));
System.out.println(”From: “+sdfFormat.format(calLastWeekDay.getTime()));
System.out.println(”To: “+sdfFormat.format(calYesterday.getTime()));
int i = 0, m = 0;
HashMap<String, HashMap> data = new HashMap<String, HashMap>();
HashMap<String, String> item = null;//new HashMap<String, String>()
String u = Config.get(”START_URL”);
WebClient client = new WebClient();
client.setCssEnabled(false);
client.setJavaScriptEnabled(false);
client.setRedirectEnabled(true);
client.setThrowExceptionOnScriptError(false);
client.setThrowExceptionOnFailingStatusCode(false);
client.setTimeout(0);
try {
//login
HtmlPage p = (HtmlPage) client.getPage(u);
HtmlForm form = (HtmlForm) p.getFormByName(”sign_in”);
HtmlInput email = (HtmlInput) form.getInputByName(”email”);
HtmlInput pass = (HtmlInput) form.getInputByName(”password”);
HtmlInput submit = (HtmlInput) form.getInputByValue(”サインイン”);
email.setValueAttribute(Config.get(”USERNAME”));
pass.setValueAttribute(Config.get(”PASSWORD”));
HtmlPage pr = (HtmlPage) submit.click();
//go to report page
HtmlPage er = client
.getPage(”https://the.report.page”);
form = er.getFormByName(”htmlReport”);
//set options
form.getInputByValue(”exact”).setChecked(true);
form.getSelectByName(”startMonth”).setSelectedAttribute(String.valueOf(calLastWeekDay.get(Calendar.MONTH)), true);
form.getSelectByName(”startDay”).setSelectedAttribute(String.valueOf(calLastWeekDay.get(Calendar.DAY_OF_MONTH)), true);
form.getSelectByName(”startYear”).setSelectedAttribute(String.valueOf(calLastWeekDay.get(Calendar.YEAR)), true);
form.getSelectByName(”endMonth”).setSelectedAttribute(String.valueOf(calYesterday.get(Calendar.MONTH)), true);
form.getSelectByName(”endDay”).setSelectedAttribute(String.valueOf(calYesterday.get(Calendar.DAY_OF_MONTH)), true);
form.getSelectByName(”endYear”).setSelectedAttribute(String.valueOf(calYesterday.get(Calendar.YEAR)), true);
HtmlInput gt = form.getInputByValue(”レポートのダウンロード(CSV形式)”);
InputStream in = null;
//retry if not available
int retry = 0;
while(in == null && retry < 50){
in = gt.click().getWebResponse().getContentAsStream();
if(in == null){
System.out.println(”Data not available! wait for 1 minute…”);
Thread.sleep(60000);
}
retry++;
}
//parse report
BufferedReader br = new BufferedReader(new InputStreamReader(in, “UTF-8″));
String line = null, key = null;
String[] cols = null;
HashMap<String, String> tmp = null;
br.readLine();
while ((line = br.readLine()) != null) {
i++;
item = new HashMap<String, String>();
cols = StringUtils.splitPreserveAllTokens(line, “\t”);//.split(”\t”);
System.out.println(”line”+i+” = “+cols.length);
if(cols.length<11 || i<2){
for(int k=0; k<cols.length; k++){
System.out.println(”cols["+k+"]=”+cols[k]);
}
continue;
}
String settleDate = sdfFormat.format(sdfParse.parse(cols[5]));
key = cols[2].trim()+settleDate;
item.put(”OUTGOINGID”, cols[2].trim());
item.put(”SETTLEDATE”, settleDate);
if(data.containsKey(key)){
tmp = data.get(key);
item.put(”ORDERCOUNT”, String.valueOf(Integer.parseInt(tmp.get(”ORDERCOUNT”)) + Integer.parseInt(cols[8].replaceAll(”,”, “”))));
item.put(”ORDERAMOUNT”, String.valueOf(Double.parseDouble(tmp.get(”ORDERAMOUNT”)) + Double.parseDouble(cols[9].replace(”¥”, “”).replaceAll(”,”, “”))));
item.put(”REVENUE”, String.valueOf(Double.parseDouble(tmp.get(”REVENUE”)) + Double.parseDouble(cols[10].replace(”¥”, “”).replaceAll(”,”, “”))));
}else{
item.put(”ORDERCOUNT”, String.valueOf(Integer.parseInt(cols[8].replaceAll(”,”, “”))));
item.put(”ORDERAMOUNT”, String.valueOf(Double.parseDouble(cols[9].replace(”¥”, “”).replaceAll(”,”, “”))));
item.put(”REVENUE”, String.valueOf(Double.parseDouble(cols[10].replace(”¥”, “”).replaceAll(”,”, “”))));
}
data.put(key, item);
}
br.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
//save report
for(Entry<String, HashMap> entry:data.entrySet()){
item = entry.getValue();
sql = new StringBuilder();
sql.append(”select OUTGOINGID, SETTLEDATE, sum(REVENUE) as REVENUE from “);
sql.append(Config.get(”TBL_CPA”));
sql.append(” where OUTGOINGID=’”);
sql.append(item.get(”OUTGOINGID”));
sql.append(”‘ and to_char(SETTLEDATE, ‘yyyy-mm-dd’)=’”);
sql.append(item.get(”SETTLEDATE”));
sql.append(”‘ group by OUTGOINGID, SETTLEDATE”);
try{
st.execute(sql.toString());
double oldRev = 0;
if(st.getResultSet().next()){
oldRev = st.getResultSet().getDouble(”REVENUE”);
}
System.out.println(”oldRev=”+oldRev);
double newRev = Double.parseDouble(item.get(”REVENUE”));
double varRev = newRev-oldRev;
if (varRev != 0){
System.out.println(”newRev=”+newRev);
sql = new StringBuilder();
sql.append(”insert into “);
sql.append(Config.get(”TBL_CPA”));
sql.append(”(WEBSITE, OUTGOINGID, SETTLEDATE, ORDERAMOUNT, ORDERCOUNT, REVENUE, LOADDATE)”);
sql.append(”values(1, ‘”);
sql.append(item.get(”OUTGOINGID”));
sql.append(”‘, to_date(’”);
sql.append(item.get(”SETTLEDATE”));
sql.append(”‘, ‘yyyy-mm-dd’), “);
sql.append(item.get(”ORDERAMOUNT”));
sql.append(”,”);
sql.append(item.get(”ORDERCOUNT”));
sql.append(”,”);
sql.append(String.valueOf(varRev));
sql.append(”, to_date(’”);
sql.append(sdfFormat.format(calYesterday.getTime()));//
sql.append(”‘, ‘yyyy-mm-dd’))”);
st.execute(sql.toString());
m++;
}else{
System.out.println(”Found no change: “+item.get(”OUTGOINGID”)+” : “+item.get(”SETTLEDATE”));
}
}catch(SQLException e){
e.printStackTrace();
}
}
System.out.println(”total=”+i+”; matched=”+m);
//write log
sql = new StringBuilder();
sql.append(”begin user.log_proceduce(’the_site’, ‘cpa_”);
sql.append(comFormat.format(calYesterday.getTime()));
sql.append(”.dat’,”);
sql.append(m);
sql.append(”,0, null, ‘revenue’); end;”);
try{
st.execute(sql.toString());
}catch(SQLException e){
e.printStackTrace();
}
client = null;
long cost = (System.currentTimeMillis()-start)/1000;
System.out.println(”cost time: “+String.valueOf(cost)+” secs.”);

云理论是实现概念的定性值与数字的定量值之间自然转换的有力工具。
本文在云理论的基础上,提出了实现概念计算(也叫简化计算)的云计算方法。概述了云模型与不确定推理;给出了计算的逻辑描述,将计算过程抽象成 为推理过程;运用机器学习的方法,给出了计算云化的过程,并且采用不确定推理的方法,给出了云的计算过程;简单阐述了云化计算的系统实现。
随着网络的日益普及,“网络存储”这样的服务也日益深入人心,有了众多的使用者,网络服务业方面的开发商自然不会错过这个大市场。几天前,微软 推出了Windows Live SkyDrive,并已经在互联网上全面进行测试,虽然容量仅仅为500MB,但是毕竟是免费的,使用的人数量极为可观。而谷歌也不是等闲之 辈,SkyDrive刚刚登场就推出了自己的超大容量网络存储方案,不过收取的费用上还需要商榷。另外,苹果公司开发的.Mac平台也瞄准了“网络存储” 这块大蛋糕,随时准备加入这场 “战争”。
近日,arstechnica等国外各大网站发表了一篇名为《Google, Microsoft and Apple building online storage havens: you win》的文章,引起了全球范围内网友的热烈讨论,微软、谷歌、苹果的“粉丝”在各大论坛议论纷纷,强烈支持各自的“阵营”,一时间硝烟四起,网络存储三 强鼎立的局面已经日渐明显。
微软公司的SkyDrive走的是纯免费路线,不过不排除这只是微软公司的“鱼饵”,毕竟天上还是不会掉馅饼的。谷歌公司则直接与美元挂钩,要 想用我的服务,当然可以,而且非常欢迎,但是容量的大小是要用美元来衡量的。从2.8GB升级到2.8GB+6GB也许我们都还可以接受,但是500美元 直接买下 250GB的空间则有些奢侈了,而且仅局限于谷歌本身的服务拓展性也太小了。苹果公司的.Mac平台之前就已经有网络存储的服务了,不过现在容量却已经从 当时极不起眼的1GB升级到了10GB,同样是99美元的.Mac平台使用年费,加量不加价是感觉还是不错的。
竞争必然会引起降价和服务质量的提升,相信这也是我们普通用户希望看到的,而网络存储全面普及的时代也将来临,希望从“云计算”(Cloud computing)的“云存储”发展起来的网络存储能够带给我们更多的惊喜,正如目前的IM即时通讯软件那样百花齐放。
Read the rest of this entry »
陈省身 张存浩先生要我讲点数学,这么短的时间,而数学这么大,只好举几个要点谈谈。 数学是什么?数学是根据某些假设,用逻辑的推理得到结论,因为用这么简单的方法,所以数学是一门坚固的科学,它得到的结论是很有效的。这样的结论自然对学问的各方面都很有应用,不过有一点很奇怪的,就是这种应用的范围非常大。 最初你用几个数或画几个图就得到的一些结论,而由此引起的发展却常常令人难以想象。在这个发展过程中,我认为不仅在数学上最重要,而且在人类文化史上也非常突出的就是Euclid在《几何原本》。这是第一本系统性的书,主要的目的是研究空间的性质。这些性质都可以从很简单的公理用逻辑的推理得到。这是一本关于整个数学的书,不仅仅限于几何学。例如,Euclid书上首先证明素数的个数是无穷的,这便是一个算术的结论。随着推理的复杂化,便有许多“深刻”的定理,需要很长的证明。例如 ,有些解析数论定理的证明,便需几十条引理。 最初,用简单的方法证明几个结果,大家很欣赏,也很重要。后来方法发展了,便产生很复杂的推理,有些定理需要几十页才能证明。现在有的结果的证明甚至上百页,上千页。看到这么复杂的证明,我们固然惊叹某些数学家高超的技巧和深厚的功力,但心中难免产生一些疑问,甚或有些无所适从的感觉。所以我想,日后数学的重要进展,在于引进观念,使问题简化。 1.有限单群 我们知道,数学的发展中有一个基本观念——群。群也是数学之中各方面的最基本的观念。怎样研究群的结构呢?最简单的方法是讨论它的子群,再由小的群的结构慢慢构造大一些的群。群中最重要的一种群是有限群,而有限群是一个难极了的题目,需要有特别的方法,特别的观念去研究。 命G为群,g∈G为一子群,如对任何g∈G-1g H g ∈H,则称H为正规的(nomal). 正规子群存在,可使G的研究变为子群H及商群G/H的研究。这样就有一个很自然的问题,有哪些有限的单群(*** group).单群除了它自己和单位元(identity)之外,没有其他的非平凡的正规子群(normalsubgroup). 数学上称其为简单群,其实一点也不简单。 有限群论的一个深刻的定理是Fei-Thompson定理:非交换单群的阶(数)(即群中元素的个数)是偶数。更不寻常的是除了某些大类(素数阶循环群Zp,交错群An(n>=5), Lie型单群)外,后来发现了26个零零碎碎的有限单群(散在单群,离散单群), 现在知道,最大的散在单群的阶是241×320×59×76×112×133×17×19×23×29×31×41×47×59×71 =808,017…=1054 这是很大的单群,由B。Fisher 和 R。L.Griess两位数学家所发现,数学家称它为魔群(怪物,Monster). 单群的权威数学家D.Gorenstein相信有限单群都在这里了,这当然是数学上一个很好的结果。把单群都确定了,就像化学家把元素都确定了,物理学家把核子的结构都确定了一样。可这里有个缺点,Gorenstein并未将证明定出来。他讲若将证明写出来至少有1000页,而1000页的证明无论如何很容易有错误。可是Gorenstein又说,不要紧,若有错误,这个错误一定可以补救。你相信不相信?数学界有些人怀疑这样的证明是否必要。现在计算机的出现,许多问题可以验证到很大的数,是否还需要严格的证明,已变成数学上一个有争论的问题。这个争论看来一时无法解决。段学复先生是我的老朋友,是有限群论的专家,也许我们可以问一下他的意见。我个人觉得这个问题很难回答。不过数学家有个自由,当你不能做或不喜欢做一个问题时,你完全不必投入,你只需做一些你能做或喜欢做的问题。 2.四色问题 把地图着色,使得邻国有不同的颜色,需要几种颜色?经验告诉我们,四色够了。但是严格的证明极难。这就是有各的四色问题。 地图不一定在球面上,也可在亏格高的的曲面上(一个亏格高为g的曲面在拓扑上讲是球面加g个把手;亏格为1的曲面可设想为环面)。可惊奇的是,这个着色问题,对于g>=1的曲面完全解决了。可以证明:有整数χ(g),满足条件:在亏格为g的曲面上任何地图都可用χ(g)种颜色着色,使邻国有不同颜色,且有地图至少需要χ(g) 种颜色。这个数在g>=1时可以完全确定。我们知道χ(1)=7,即环面上的地图可用七色着色,四色不够。 令人费解的是,证明地球上四色定理,困难多了。现有的证明,需要计算机的帮助,与传统的证明不同。而我们觉得最简单的情况,即我们住的地球球面上的着色问题反而特别复杂。把扩充的问题解决了,得到了很有意思的结论。但是回到基本问题,反而更难。 这种现象不止这一个,还有很多,一个例子是所谓的低维拓扑,即推广的问题更简单,而本身核心的问题反而不易克服,这确是数学神秘性的一面。 3.椭圆曲线 最近的数学进展,最受人注意的结果就是Fermat大定理的证明。Fermat大定理说:方程式xn + yn=zn ,n>2没有非平凡的整数解(即xyz<>0). 这个传说了300年的结果的证明,最近由Princeton大学的教授Andrew J.Wiles(英国数学家)给出。但证明中缺一段,是由他的学生Richard Tarlor补充的。因此,Fermat 定理现在已经有了一个完全的证明。整个文章发表在最近一期的“Annals of Mathematics”(Prinston大学杂志,1996,第一期)整个一期登的是Wiles与Taylor的论文,证明Fermat定理(Wiles为此同Robert Langlands 获得了1996年的Wolf奖与National Academy Science Award in Mathematics). 有意思的是,证明这个定理的关键是椭圆曲线。这是代数数论的一个分支。有以下一则故事。英国的大数学家G.H.Hardy(1877-1947)有一天去医院探望他的朋友,印度天才数学家S.A.Ramanujan(1887-1920).Hardy 的汽车号是1729。他向Ramanujan说,这个数目没有意思。Ramanujan说,不然,这是可以用两种不同方法写为2个立方之和的最小的数,如1729=13+123=93+103这结果可用椭圆曲线论来证明。 我们知道,要找一个一般方程的解不容易的,而要找一个系数为整数的多项式方程P(x,y) = 0(传统上叫Diophantine方程)的整数解更困难。因为普通的解不会是整数,这是数论中的一个主要问题。 需要说明的,在Wiles 完成这个证明之前,我有一位在Berkley的朋友Kenneth A.Ribet ,他有重要的贡献。他证明了一日本数学家Yutaka Taniyama的某一个关于椭圆曲线的假设包含Fermat定理。于是可将Fermat 定理变为一个关于椭圆曲线的定理。Wiles根据Ribet的结果又继续经过了许多步骤,以至达到最后的证明。即在复平面内得到曲线。由复变函数论知道,复平面内的曲线就成为一个Riemann曲面。Riemann曲面为定向曲面,它可以是球,也可以是球加上好多把手。其中有一个最简单的情形,就是一个球加上一个把手,即一个环面。环面是个群,且为可交换群。 所谓椭圆曲线,就是把这个曲线看成复平面内亏格(genus)等于1的复曲线。亏格等于1的曲线有一个非常深刻而巧妙的性质。即它上面的点有一个可交换群的构造。两个点可以加起来,且有群的性质。这是很重要的性质。椭圆曲线与椭圆无关。原因是,若所有曲线的亏格大于1,相当于Riemann曲面有一个Poincare度量,它的曲率等于1,所有曲面若其曲率等于—1,则叫做双曲的。亏格等于1的叫椭圆。亏格等于0的叫抛物线。椭圆曲线的研究是数论中非常重要,非常有意思的方面。最近一期的科学杂志(Science),有位先生写了一篇关于椭圆曲线的文章。椭圆曲线在电报的密码上有应用。而中国也有很多人在做代数几何与代数数论方面的工作。最近在黄山有一个国际性的,题为“代数几何与代数数论”的会议,由冯克勤先生主持。 从这个定理我们应认识到:高深的数学是必要的。Fermat定理的结论虽然简单,但它蕴藏着许多数学的关系,远远超出结论中的数学观念。这些关系日新月异,十分神妙,学问之奥,令人拜赏。 我相信,Fermat定理不能用初等方法证明,这种努力是徒劳的。数学是一个整体,一定要吸取几千年所有的进步。 4.拓扑与量子场论 1995年初的一天晚上,我在家看晚间电视新闻。突然,我听到自己的名字,大吃一惊。原来加利福尼亚发一种彩票,头彩300万美元,若无人中彩的话,可以积累到下一次抽彩。我从前的一个学生,名Robert Uomini, 中了头彩美金2200万元。他曾选过我的本科课,当时还对微分几何很有兴趣。他很念旧,以100万美元捐赠加州大学,设立“陈省身讲座”。学校决定,以此讲座邀请名学者为访问教授。第一位应邀的为英国数学家Sir Michael Atiyah. 他到中国不止一次。他是英国影响最大的数学家,剑桥大学三一学院的院长,则卸任的英国皇家协会会长。Atiyah很会讲学,也很博学,他的报告有很大的吸引力。他作了八讲,讲题是“拓扑与量子场论”。 这是当前一个热门的课题,把高深的数学和物理联系起来了,导出了深刻的结果。现在拓扑在物理上有非常重要的应用,这跟杨振宁的Yang-Mills场方程有很密切的关系。 杨先生喜欢说,你们数学家写的东西,我们学物理的人看不懂,等于另外一种文字。我想我们搞数学的人有责任把我们的结果,写成不是本行的人也至少知道你讲的是怎么一回事。 物理学,量子力学,尤其是量子场论与数学的关系其实并不复杂。说到数学的应用,讲一下矢量空间,Euclid空间就是一个矢量空间。再进一步,多个矢量空间构成一个拓扑空间,这就是所谓的矢量丛,即一束这样的空间。这样的空间有一些简单的性质。比如说,局部来讲,这种矢量空间是一个chart,是一个集,可用坐标来表示。结果发现矢量丛这种空间在物理上很有用。物理学的一个基本观念是“场”。最简单的场是电磁场,尤为近代生活的一部分。电磁场的“势”适合Maxwell方程。Hermann Weyl第一个看出这个势不是一个确定的函数。它可以变化。这在物理上叫做规范(gauge, 不完全确定的,可以变化的),这就是物理上规范场论的第一个情形。 物理上有4种场:电磁场,引力场,强作用场和弱作用场。现在知道,这些场都是规范场。即数学系上是一束矢量空间,用一个线性群来缝住的。电磁场的重要推广,是Yang-Mills的规范场论。杨先生的伟大贡献就是在SU(2)(special unitary group in two variables)情形下得到物理意义明确的规范场,即同位旋(isospin)规范场,这种将数学现象给以物理的解释,是件了不起的工作,因为以往的Maxwell场论是一个可交换的群。现在变为在SU(2),群是不能交换的。而实际上,物理中找到了这样的场,这是科学上一个伟大的发展。数学家可以自豪的是,物理学家所需的几何观念和工具,在数学上已经发展了。 杨先生之所以有这么大的成就,其中一个很重要的,很了不起的原因是除了物理的感觉以外,他有很坚实的数学基础。他能够在这大堆复杂的方程中看出某些规律,它们具有某种基本的数学性质。Yang-Mills方程的数学基础是纤维丛。这种观念Dirac就曾有过。Dirac的一篇基本论文中就讲到这种数学。但Dirac没有数学的工具。所以他在讲这种观念时,不但数学家不懂,就连物理学家也不懂。不过,其中有一个到现在还未解决的物理含义,即有否磁单极(magnetic monople)。可能会有。就是说,有否这样的场,它的曲率不等于0(曲率是度量场的复杂性的)?物理上要是发现了这种场,会是件不得了的事实。这些观念的数学不简单。 Yang-Mills方程反过来影响到拓扑。现在的基础数学中,所谓低维拓扑(二维,三维,四维)非常受人注意。因为物理空间是四维空间。而四维空间有许多奇妙的性质。我们知道代数几何,曲线论,复变函数论等许多基础数学理论是二维拓扑。而现在必到四维,四维有spinor理论,有quantum结构。四维与物理更接近。它的结构是Lorentz结构,而不是Riemann结构。这方面有很多工作可做。根据Yang-Mills方程,对于四维拓扑,Atiyah的学生英国数学家Simon Donaldson有很重要的贡献。其中有一个结果就是利用Yang-Mills方程证明四维Euclid空间R4有无数微分结构与其标准结构不同。这一结果最近又由Seiberg-Witten的新方程大大的简化了。这是最近拓扑在微分几何,理论物理应用方面最引人注意的进展。 二维流形的发展有一段光荣的历史,牵涉到许多深刻的数学,可以断言,三维,四维流形将更为丰富和神妙。 5.球装问题(Sphere Packing) 如何把一定的空间装得最紧,显然是一个实际而重要的问题。项武义教授最近在这方面做了很重要的工作。这里先介绍一个有关的问题:围着一个球,可以放几个同样大小的球?我们不妨假定球的半径为一,即单位球。在平面情形,绕一单位圆我们显然可以放6个单位圆。而在三维空间的情况则更为复杂。如果把单位球绕单位球相切,不难证明,12个球是放得进的。这时虽然还剩下许多空间,但不可能放进第13个球。要证明这一结论并不容易。当年Newton与Gregory有个讨论。Newton 说第13个球装不进,Gregory说也许可以。这个争论长期悬而未决。一直到1953年,K.Schutte和B.L.van der Waerden才给了一个证明。这个证明是很复杂的。 一个更自然的问题是怎样把一个立方体空间用大小相同的球装得最紧。衡量装得是否紧凑的尺度是密度(density),即所装的球的总的体积和立方体空间的体积的比例。 Kepler于1611年提出了一个猜想:他认为立方体的球装的密度不会大于π/(181/2). 项武义说他证明了这个猜想。可是有人(Gabor Fejes Toth)认为他的证明不完全,甚至有人(Thomas L.Hales)说是错误的。”Mathematical Intelligencer”这个杂志上(1995年),有关于这一问题的讨论,项武义有个答复。Toth 是匈牙利数学家,三代人搞同一个课题。匈牙利数学很发达,在首都布达佩斯有个200多人的几何研究所。我不知道几何中是否有这么多重要的问题需要这么多人去做。最年轻的Toth在“Mathematics Reviews”中有篇关于项的文章的评论。他说项的文章有些定理没有详细的证明。天下的事情就是这样。做重要工作有争议的时候,便产生一些有趣的现象。不过他觉得项的意思是对的。不但项的意思是对的,甚至表示这个意思他从前也有。最近项武义抒他认为没有的证明都有写出来了。 最主要的,我要跟大家说的是立体几何在数学中是很重要而因难的部分。即使平面几何也可能很难。到了立体时,则更为复杂。近年来对碳60(C60)的研究显示了几何在化学中的应用。多面体图形的几何性质对固态物理也有重大的作用。。球装不过是立体几何的一个问题。立体几何是大有前途的。 6.Finsler几何 最近经我鼓励,Finsler几何有重大发展,作简要报告如下: 在(x,y)平面上设积分s = ∫ab F(x,y,dy/dx)dx其中y是x的未知函数。求这个积分的极小值,就是第一个变分学的问题。称积分s为弧长,把观念几何化,即得Finsler几何。 Gauss看出,在特别情形: F2 =E(x,y) + 2F(x,y) y’ +G(x,y)y’2 ,y’=dy/dx其中E,F,G为x,y的函数,几何性质特别简单。1854年,Riemann的讲演讨论了整个情形,创立了Riemann-Finsler几何。百余年来,Riemann几何在物理中有重要的应用,而整体Riemann几何的发展更是近代数学的核心部分。 Riemann的几何基础包含Finsler几何。我们最近几年的工作,把Riemann几何的发展,局部的和整体的,完全推广到Finsler几何,而且很简单。因此,我觉得以后的微分几何课或Riemann几何课都应该讲一般情形.最近有几个拓扑问题.最主要的一个是Riemann流形的一个重要性质,即英国数学家Hodge的调和积分。现在有2个年轻人,一个是David Bao, 另一个是他的美国学生,抒这个Hodge的调和积分推广到了Finsler情形。这将是微分几何的一块新园地,预料前景无限。1995年夏在美国西雅图有一Finsler几何的国际会议。其论文集已于今年由美国数学会出版. Finsler 几何在1900年有名的Hilbert演讲中是第23个问题。 7.中国的数学 数学研究的最高标准是创造性:要达到前人未到的境界,要找着最深刻的关键。从另一点看,数学的范围,是无垠的。我愿借此机会介绍一下科学出版社从俄文翻译的《数学百科全书》,全书5大卷,每卷约千页。中国能出版这样的巨著,即是翻译,也是一项可喜的在就。这是一部十分完备的百科全书,值得赞扬的。 对着如此的学问大海,入门必须领导,便需要权威性的学校和研究所。数学是活的,不断有杰出的贡献,令人赞赏佩服。但一个国家,比较可以集中某些方面,不必完全赶时髦。当年芬兰的复变函数论,波兰的纯粹数学,都是专精一门而有成就的例子。 中国应该发展实力较强的方面。但由百科全书的例子,可看出中国的数学是全面的。这是一个可喜的现象。 中国的财富在“人民”。中国的数学政策,除了鼓励尖端的研究以外,应该用来提高一般的数学水平。我有两个建议:(1)设立数学讲座,待遇从优,其资格可能是对数学发展有重大贡献的人;(2)设立新的数学中心,似乎成都,西安,广州都是可能的地点。中心应有相当的经费,部分可由地方负担,或私人筹措。近年因为国家开放,年轻人都想经商赚钱,当然国家社会需要这样的人。但是做科学的乐趣是一般不能理解的。在科学上做了基本的贡献,有历史的意义。我想对于许多人,这是一项了不得的成就。在岗位上专心学问,提携后进,“得天下之英才而教育之“,应该是十分愉快的事情。 一个实际的问题,是个人应否读数学。Hardy 说,一个条件是看你是否比老师强。这也许太强一些。我想学习应不觉困难,读名著能很快与作者联系,都是测验。数学是小科学,可以关起门来做。在一个多面竞争的社会中,是一项有优点的职业,即使你有若干能力。 中国的数学有相当水平。年来政治多变,达此情况,足风中华民族的勤劳本质。从前一个数学家的最高标准,是从国外名大学获得博士学位。我们国家现在所包需做的,是充实各大学的研究院,充实博士学位,人才由自己训练。
(庆祝自然科学基金制设立15周年和国家自然科学基金委员会成立10周年的讲演)
先讲讲有限单群的问题。
摘要:我国著名青少年教育家孙云晓先生曾说:“好习惯对儿童来说是命运的主宰,是成功的轨道,是终身的财富,是人生的格调”。……
我国著名青少年教育家孙云晓先生曾说:“好习惯对儿童来说是命运的主宰,是成功的轨道,是终身的财富,是人生的格调”。因此,作为父母,一定要在孩子的习惯培养上下大功夫。培养孩子的良好习惯可从以下几个方面做起:
(一)生活习惯
生活是人生第一课,也是最基本的课程,生活习惯的好坏,不仅影响幼儿的身心健康而且也是幼儿综合素质的体现。它包括饮食、 起居、排便、卫生等习惯,做到按时睡眠、起床、安静睡眠并有正确的睡姿,不挑食、不偏食、细嚼慢咽,饭前便后正确洗手、早晚刷牙,饭后漱口等。父母要根据 孩子的年龄特点,适当为孩子立规矩,如:玩具玩完后必须放回原处,逐渐养成自己的东西自己整理和爱清洁,讲卫生,有条理的好习惯。
(二)文明礼貌习惯
礼貌看起来是种外在行为的表现,实际上它反映着人的内心修养,体现一个人自尊和尊重他人的意识。父母要教育孩子,学习使用文明礼貌用语,如“您好 ”、“请”、“谢谢”、“对不起”、“请原谅”。同时,要注意培养孩子的文明举止,见人要热情打招呼,别人问话要先学会倾听,并有礼貌地回答,保持服装整 洁,站有站相,坐有坐相。
(三)道德习惯
养成良好的道德习惯,幼儿才能和别人友好相处,积极追求美好的事物,自觉遵守社会行为规范,具有高度责任感,将来才能成为社会上成熟可敬的人。它包 括各种行为规则,尊敬关爱长辈,不随地地大小便、不损坏花草、树木、爱护公共财务,遵守交通规则,能换位思考、团结友爱等等。
(四)学习习惯
良好的学习习惯对幼儿的学习兴趣与学习成绩有很大的影响,与幼儿的成材直接相关。它包括自主学习、合作学习、探究性学习。学习好的孩子学习习惯都比 较好,而学习不好的孩子多数并不是因为脑子笨,而是没有良好的学习习惯。如:不长时间看电视、玩电脑游戏,不需要父母的督促、陪伴能自觉完成学习任务,学 习专心认真,经常进行广泛的阅读,知道珍惜时间,什么时间做什么事情等。
(五)思维习惯
良好的思维习惯有助于孩子从正确的角度和方面思考问题,有助于孩子能力的锻炼,知识的获取以及运用所学的知识灵活的解决问题。如:感觉接触了解新鲜事物,善于观察,勤于动脑,遇到问题能独立思考和解决。特别是要具有创新精神和创新能力。
(六)劳动习惯
培养孩子爱惜劳动成果,孩子劳动不是为了创造物质和精神财富,而是为了培养初步的劳动习惯,促进孩子身心健康成长。要求自己能做的事情自己做,自己穿脱衣服、学着铺床叠被等,另外帮父母干些家务活,如:帮助摆碗筷、擦桌、扫地、倒垃圾等等。
值得注意的是,在培养孩子各种良好习惯的同时,父母首先要转变自己的观念,增长培养意识,提高自身素质,以身作则。在进行培养时还要注意方式方法,坚持不懈,严格要求。总而言之,播下一种行动,收获一种习惯;播下一种习惯,收获一种命运。

“数学是一门研究数量关系和空间形式的科学”的说法在中国曾经十分流行,这可能与恩格斯著作的长期影响有关。对于数学,今天人们更加认同于如下的说法:
“数学是一个完全自成体系的知识领域…数学仅仅讨论它本身想象中的实体及关系”(《科学技术百科全书》[麦格劳-希尔图书公司]第1卷数学,科学出版社1980,235-236页);
“到1900年,数学已经从实在性中分裂出来了;它已经明显地而且无可挽回地失去了它对自然界真理的所有权,因而变成了一些没有意义的东西的任意公理的必然推论的随从了”( 克莱因《古今数学思想》第4册,上海科学技术出版社1979,111页)。
照此说法,数学就不是“数”学了。然而,数学与生俱来的强大应用性并不因为“数学已经从实在性中分裂出来了”而有稍微的减弱。既是抽象的又有实在的一面,人们逐渐形成了对数学的主流看法——数学的现状“一方面是其内在的统一性,另一方面是外界应用的更高的自觉性”,数学的两种趋势是“从外部寻求新问题和在内部追求统一”(美国国家研究委员会《振兴美国数学——90年代的计划》,叶其孝等译,世界图书出版公司1993),而不再局限于给数学下一个定义。
无理数是一个能恰好地描述数学特征的案例。从数学发展史看,人类对无理数的发蒙始于古希腊毕达哥拉斯(Pythagoras,公元前582-497)学 派,但二千四百年后才产生包括无理数在内的实数严格定义;从当今教育的知识体系看,学生在初中阶段开始接触无理数,直到大学毕业却仍然不明白无理数的实质 含义。历史与现实两者的契合正好说明无理数的两面特征,应用性使得它是常见的数学工具之一,而抽象性又使所有非数学工作者不能真正认识它。
数系的扩张过程以自然数为基础,德国数学家克罗内克(Kronecker,1823-1891)说“上帝创造了整数,其它一切都是人造的”(克莱因《古今数学思想》第4册,上海科学技术出版社1979,41页)。零与自然数的产生源于人类在生存活动中的原始冲动,这一推测想来不会有问题,人的双手有十指与十进制的广泛使用也当然有密切关系;
类似于 2+3=5 的事实产生了加法的概念,然而2加上几会等于1呢?由此需要定义负数:一个数的“负数”即它与该数之和等于0;进而定义减法。产生零、负自然数,合称整数;
加法的重复进行产生了乘法,2×3=6 就是三个2相加。然而2乘以几会等于1呢?由此需要定义倒数:一个数的“倒数”即它与该数之积等于1,进而定义除法,产生既约分数,合称有理数。
最早出现的无理数也与计数、测量有关。乘法的重复进行产生了乘方,23 就是三个2相乘,然而哪个数的平方会等于2呢?毕达哥拉斯学派提出了这个问题,边长为1的正方形的对角线的长度不是既约分数,后来用√2表示对角线的长度,无理数的概念初步形成。
以下是关于√2不是有理数的一个证明,载于欧几里德《几何原本》,但据说是更早的毕达哥拉斯学派所作 :设√2是既约分数p/q,即√2=p/q,则2q2=p2,这表明p2是偶数,p也是偶数(否则若p是奇数则p2是奇数),设p=2k,得 q2=2k2,于是q也是偶数,这与p/q是既约分数矛盾。
虽然开方运算可能产生无理数,但仿照上述办法来扩张数系会遇到困难。例如仅用开方定义新的数例如√2,3√2(后来被称为初等无理数)是不够的; (1+√2) 就不能通过对某有理数开方而得,那么(1+√2)是什么?试作一比较,任何有理数总可以乘以某整数而还原成整数,但(1+√2)的任何次乘方却不可能得到 有理数。
但又有新的问题,挪威数学家阿贝尔(Abel,1802-1829)于1825年证明“一般五次方程不能只用根式求解”,紧接着法国数学家伽罗瓦(Galois,1811-1832)解决“方程须有何种性质才可求根式解”的问题,复合无理数立即黯然失色。
数学家顽强地推进,索性将新的数系定义为所有有理系数方程的根(后来称为代数数),有理数、初等无理数、复合无理数都被包括在内。数系的扩张本来是从现实需要出发的问题,但现在已经开始变得抽象了,因为代数数中那些不是有理数、初等无理数、复合无理数的“数”究竟什么样子?这不仅不能回答,似乎也并不重要,重要的是这样的“数”确实存在。
不得不面对的烦恼是,一个代数数的描述与运算都必须通过相关的代数方程的系数,而且代数方程的根通常不是唯一的。
彻底摧毁这一定义方式的是1844年柳维尔(Liouville,1809-1882)证明非代数数的存在。早在1830年代,e=1+(1/1!)+(1+2!)+…+(1/n!)+…与圆周率π被证明是无理数,在柳维尔的结论宣布后不久,1873年、1883年数学家埃尔米特(Hermite,1822-1901)与林德曼(Lindemann,1852-1939)先后证明e,π不是代数数。
由于有理数可表示成有限小数或无限循环小数,人们想到用“无限不循环小数”来定义无理数,这也是直至19世纪中叶以前的实际做法。它看起来很通俗,不明白无理数奥妙的人大体也是这样理解无理数的。但这样做遇到的困难更大:关键的问题是你无法判断一个数是无限不循环的,也不能将两个无限不循环的数进行加减乘除。
不循环的无限小数当然是难以认识,如果我们翻用一下列夫?托尔斯泰著名小说《安娜?卡列尼娜》中的名句“幸福的家庭都是幸福的;不幸的家庭各有各的不幸”,那就是:循环的小数都是一样的循环,不循环的小数各有各的不循环!16世纪德国数学家施蒂费尔(Stifel,约1486-1567)说“当我们想把它们数出来(用十进小数表示)时,…就发现它们无止境地往远处跑,因而没有一个无理数实质上是能被我们准确掌握住的…。而本身缺乏准确性的东西就不能称其为真正的数…。所以,正如无穷大的数并非数一样,无理数也不是真正的数,而是隐藏在一种无穷迷雾后面的东西”(克莱因《古今数学思想》第1册,上海科学技术出版社1979, 292页)
克莱因指出“所有在Weierstrass(德国数学家外尔斯特拉斯1815-1897——引注)之前引进无理数的人都采用了这样的概念,即无理数是一个以有理数为项的无穷序列的极限。但是这个极限,假如是无理数,在逻辑上是不存在的,除非无理数已经有了定义”(克莱因《古今数学思想》第4册,上海科学技术出版社1979,46页)。
一本著名的数学教材将“无限不循环小数”称为“中学生的实数”,“用这个定义,实数是非常具体的对象,但在定义加法和乘法时所包含的困难是不容忽视的”,在介绍了加法定义的一种方式及指出乘法可类似处理后说“不过,乘法逆元素的存在将又一次是最困难的”并就此打住(斯皮瓦克《微积分》下册,张毓贤等译,人民教育出版社1981,695页)。
根据施蒂费尔的说法我们只能说√2不是有理数,而不能说它是无理数,因为我们还没有定义什么是“无理数”。前述古希腊人关于√2无理性的证明应当是“不存在这样的有理数使其平方等于2”。由于除了有理数就没有数,√2根本就不是“数”。
现在可以看到无理数问题的困难所在:从开方运算的逆运算与确定边长为1的正方形的对角线长度的需要,都应当在有理数的基础上再扩大,这与以往从自然数扩 大到整数、从整数扩大到有理数没有什么两样。然而在具体做法上,利用运算的逆向进行或通过对有理数进行代数运算或用代数方程的根而产生的“数”是不完全的,“无限不循环小数”的说法又不合理不严格。这一困难使数学史上数系的扩张停滞了两千多年。
进一步扩张数系的必要性是不成问题的,在很长时间里人们将无理数理解为其近似值,从实用的角度来说,一个没有严格定义的东西难道就不能存在、不能使用 吗?但是数学奉行严密逻辑的理念自欧几里德《几何原本》以来就坚定不移,不以现实为背景的非欧几何的产生(18世纪)加深了数学家对于摆脱实在性的趋同。
从整数产生有理数曾经主要是根据测量、计数的需要,但现在要回到始点从头做起。例如纯粹从数学发展的内在动力与逻辑展开来定义有理数:
设p,q是整数,则数偶(p,q)称为有理数,规定两个有理数的乘法、加法规则,证明它们符合交换律、结合律等等。这是一个用以参考的范式:将某种“对象”定义为实数,其目标与要求应当是能包含以上已有的所有对象,有通常的加法乘法且符合运算规则。
以下介绍的两种定义中的“数”仅指有理数,而实数是用“数”按特定方式构成的那样一些“对象”或“东西”。
戴德金(Dadekind,1831-1916)定义:一个实数定义为有理数的一个集合,这个集合是数轴上所有有理数从某处分开的左边“一半”(数学术语为“分割”),且没有最大的数。
按戴德金的定义,实数集合的每个元是有理数集合的一个子集,一个实数是有理数的一个集合。例如所有小于2的有理数集合确定一个实数,它就是2;所有其平方小于2的有理数集合确定一个实数,它就是√2。须注意这两例有一个重要区别,对应于有理数的“分割”其“右半”有最小的数2,对应于无理数的“分割”其“右半”没有最小的数。戴德金的定义来源于这样的启示:每个有理数作为有长度的线段,对应着数轴上的坐标。边长为1的正方形的对角线线段也应对应数轴上的一个点,这意味着如果只有有理数,数轴上存有“空隙”——尽管有理数非常稠密。应当填补这些“空隙”使数轴成为完美的,欧几里德《几何原本》中曾记载过这一思想的雏形。
康托(Cantor,1845-1918)定义:一个实数定义为有理数的柯西序列a1,a2,…,an,此处an都是有理数,且满足对于任意自然数p必有自然数N,使当m>N,n>N时有|am-an|<1/q。康托的定义来源于如下的启示:若只限于有理数,则“微积分”的命题“单调有界数列必收敛”可能不成立,例如有理数数列x0=1,xn+1=(xn+2/xn)/2 是单调递减的、有界的,其极限是√2。
在以上两种定义中还要分别规定实数之间的大小比较、如何运算然后证明运算是符合熟知的规则的。另一个需要解决的重要问题是,这两种实数定义所规定的这些“东西”在抽象意义上是不是相同的?如果不能肯定回答岂不会带来一片混乱,何况还会有其它形式的实数定义。这些问题当然都已一一妥帖解决。
为了加深印象,现在我们必须用最简明最通俗的语言来描述一下“实数”:按戴德金的说法,一个实数是有理数的一个集合;按康托的说法,一个实数是有理数的一个(柯西)序列。数学史上还有别的实数定义,在那里实数又有另外一副面孔。
几乎在构建实数体系的同时,1874年康托还证明了无理数比有理数多得多、非代数数比代数数多得多!这也意味着,无形的、不是根式的无理数竟比直观的、根式的无理数多得多!数轴上代表有理数的点虽然是稠密的——任何两个有理数点之间恒有无数多有理数点,但是除有理数点外的“空隙”更多。“空隙”一旦填满,稠密概念发展成了连续的概念,数轴上点与实数完全对应,无理数问题画上了永远的句号。这里涉及关于集合中元素“个数”的比较问题,本文限于篇幅就此打住了。
实数体系的建立,使得诸如3√2表示什么得以明确,“高等数学”中命题“单调有界数列必收敛”、闭区间连续函数的性质得以证明。
然而从应用角度或对于非数学工作者(绝大多数人)而言,却是再次回到古希腊。无理数仍然是“小数”,人们并不真正关心它的“无尽”、“不循环”,事实上也无法弄清楚,只是按需要取作适当位数的近似值。例如说到圆周率π,为什么要关心它是循环的还是不循环的呢?“十位小数就足以使地球周界准确到一英寸以内,三十位小数便能使整个可见宇宙的四周准确到连最强大的显微镜都不能分辨的一个量”(丹齐克《数:科学的语言》苏仲湘译,上海教育出版社2000年,98页)。
至于数学家,在定义了无理数之后依然两手空空,数学家所知道的无理数确实少的可怜:知道得最多的只是各式各样的根式,这是古希腊人即已知道的;其次是π与e两个非代数数。那些比代数数多得多的无理数在哪儿?1900年数学家希尔伯特(Hilbert,1862-1943)提出著名的23个数学问题即包括了这一内容。以后的进展是,数学家证明若α是代数数(除0与1)、β是无理的代数数,则αβ是非代数数(1934年)。然而,若稍微追问一句“(π+e)是无理数还是有理数”?则至今都没有严密的答案。数学家心安理得的是建立了无懈可击的实数体系,在坚实的基础上,任何闲言碎语都是不足道的。无理数所体现的完美无缺、一丝不苟的纯粹理性与无孔不入、尽人皆知的世俗应用,可谓占尽天上人间风光,正是数学的魅力之所在。

数学 mathematics, maths(BrE), math(AmE)
公理 axiom
定理 theorem
计算 calculation
运算 operation
证明 prove
假设 hypothesis, hypotheses(pl.)
命题 proposition
算术 arithmetic
加 plus(prep.), add(v.), addition(n.)
被加数 augend, summand
加数 addend
和 sum
减 minus(prep.), subtract(v.), subtraction(n.)
被减数 minuend
减数 subtrahend
差 remainder
乘 times(prep.), multiply(v.), multiplication(n.)
被乘数 multiplicand, faciend
乘数 multiplicator
积 product
除 divided by(prep.), divide(v.), division(n.)
被除数 dividend
除数 divisor
商 quotient
等于 equals, is equal to, is equivalent to
大于 is greater than
小于 is lesser than
大于等于 is equal or greater than
小于等于 is equal or lesser than
运算符 operator
平均数mean
算术平均数arithmatic mean
几何平均数geometric mean n个数之积的n次方根
倒数(reciprocal) x的倒数为1/x
有理数 rational number
无理数 irrational number
实数 real number
虚数 imaginary number
数字 digit
数 number
自然数 natural number
整数 integer
小数 decimal
小数点 decimal point
分数 fraction
分子 numerator
分母 denominator
比 ratio
正 positive
负 negative
零 null, zero, nought, nil
十进制 decimal system
二进制 binary system
十六进制 hexadecimal system
权 weight, significance
进位 carry
截尾 truncation
四舍五入 round
下舍入 round down
上舍入 round up
有效数字 significant digit
无效数字 insignificant digit
代数 algebra
公式 formula, formulae(pl.)
单项式 monomial
多项式 polynomial, multinomial
系数 coefficient
未知数 unknown, x-factor, y-factor, z-factor
等式,方程式 equation
一次方程 simple equation
二次方程 quadratic equation
三次方程 cubic equation
四次方程 quartic equation
不等式 inequation
阶乘 factorial
对数 logarithm
指数,幂 exponent
乘方 power
二次方,平方 square
三次方,立方 cube
四次方 the power of four, the fourth power
n次方 the power of n, the nth power
开方 evolution, extraction
二次方根,平方根 square root
三次方根,立方根 cube root
四次方根 the root of four, the fourth root
n次方根 the root of n, the nth root
sqrt(2)=1.414
sqrt(3)=1.732
sqrt(5)=2.236
常量 constant
变量 variable
坐标系 coordinates
坐标轴 x-axis, y-axis, z-axis
横坐标 x-coordinate
纵坐标 y-coordinate
原点 origin
象限quadrant
截距(有正负之分)intercede
(方程的)解solution
几何geometry
点 point
线 line
面 plane
体 solid
线段 segment
射线 radial
平行 parallel
相交 intersect
角 angle
角度 degree
弧度 radian
锐角 acute angle
直角 right angle
钝角 obtuse angle
平角 straight angle
周角 perigon
底 base
边 side
高 height
三角形 triangle
锐角三角形 acute triangle
直角三角形 right triangle
直角边 leg
斜边 hypotenuse
勾股定理 Pythagorean theorem
钝角三角形 obtuse triangle
不等边三角形 scalene triangle
等腰三角形 isosceles triangle
等边三角形 equilateral triangle
四边形 quadrilateral
平行四边形 parallelogram
矩形 rectangle
长 length
宽 width
周长 perimeter
面积 area
相似 similar
全等 congruent
三角 trigonometry
正弦 sine
余弦 cosine
正切 tangent
余切 cotangent
正割 secant
余割 cosecant
反正弦 arc sine
反余弦 arc cosine
反正切 arc tangent
反余切 arc cotangent
反正割 arc secant
反余割 arc cosecant
集合aggregate
元素 element
空集 void
子集 subset
交集 intersection
并集 union
补集 complement
映射 mapping
函数 function
定义域 domain, field of definition
值域 range
单调性 monotonicity
奇偶性 parity
周期性 periodicity
图象 image
数列,级数 series
微积分 calculus
微分 differential
导数 derivative
极限 limit
无穷大 infinite(a.) infinity(n.)
无穷小 infinitesimal
积分 integral
定积分 definite integral
不定积分 indefinite integral
复数 complex number
矩阵 matrix
行列式 determinant
圆 circle
圆心 centre(BrE), center(AmE)
半径 radius
直径 diameter
圆周率 pi
弧 arc
半圆 semicircle
扇形 sector
环 ring
椭圆 ellipse
圆周 circumference
轨迹 locus, loca(pl.)
平行六面体 parallelepiped
立方体 cube
七面体 heptahedron
八面体 octahedron
九面体 enneahedron
十面体 decahedron
十一面体 hendecahedron
十二面体 dodecahedron
二十面体 icosahedron
多面体 polyhedron
旋转 rotation
轴 axis
球 sphere
半球 hemisphere
底面 undersurface
表面积 surface area
体积 volume
空间 space
双曲线 hyperbola
抛物线 parabola
四面体 tetrahedron
五面体 pentahedron
六面体 hexahedron
菱形 rhomb, rhombus, rhombi(pl.), diamond
正方形 square
梯形 trapezoid
直角梯形 right trapezoid
等腰梯形 isosceles trapezoid
五边形 pentagon
六边形 hexagon
七边形 heptagon
八边形 octagon
九边形 enneagon
十边形 decagon
十一边形 hendecagon
十二边形 dodecagon
多边形 polygon
正多边形 equilateral polygon
相位 phase
周期 period
振幅 amplitude
内心 incentre(BrE), incenter(AmE)
外心 excentre(BrE), excenter(AmE)
旁心 escentre(BrE), escenter(AmE)
垂心 orthocentre(BrE), orthocenter(AmE)
重心 barycentre(BrE), barycenter(AmE)
内切圆 inscribed circle
外切圆 circumcircle
统计 statistics
平均数 average
加权平均数 weighted average
方差 variance
标准差 root-mean-square deviation, standard deviation
比例 propotion
百分比 percent
百分点 percentage
百分位数 percentile
排列 permutation
组合 combination
概率,或然率 probability
分布 distribution
正态分布 normal distribution
非正态分布 abnormal distribution
图表 graph
条形统计图 bar graph
柱形统计图 histogram
折线统计图 broken line graph
曲线统计图 curve diagram
扇形统计图 pie diagram

20世纪60年代出现了非标准分析,它是利用数理逻辑方法
来探讨和刻画微积分的理论基础,引起了人们的重视,为数学开辟了新的研究领域。
通 常的数学分析,又称为标准分析,其主要部分是微积分学,它是以现实世界中的连续变量及其相互关系为研究对象的数学分支。它的基本概念是在实数系范围内取值 的变量和函数的概念,它的研究方法是极限理论。所以,标准分析是指十九世纪柯西、魏尔斯特拉斯等人用极限方法所建立的微积分理论,他们在数学的证明中用极 限方法代替了无限小量方法,对微积分理论作了较严谨的逻辑论证,他们的理论比十七、十八世纪的微积分理论前进了一大步。这表现在它创立了一系列判别法则, 发现了关于函数的连续性、可微性的一些重要结果。
围绕微积分的一场争论曾在18世纪初激烈进行。话可从牛顿时代说起。试看求y=x2的导数。先取无穷小量⊿x,则⊿y=(x+⊿x)2-x2=2x⊿x+⊿x2,即⊿y/⊿x=2x+⊿x。又因为⊿x是无穷小量可忽略不计,即得y/=2x。无穷小量⊿x在这里既不是0(可用⊿x 去除),却又等于0(最后忽略不计,⊿x就消失了)。这套办法似乎有点像变魔术。马克思称略去⊿x是“暴力镇压”,大主教贝克莱则呼之为“逝去量的鬼魂”或“已死量的幽灵”(ghosts of departed quantities)。这种把无穷小神秘化的做法确实不太好,“招之即来,呼之即去”,完全是神差鬼使的一套。然而不管如何攻击,它的运算结果却总是对的。大数学家欧拉曾用这种不严格的微积分做出了辉煌的成果。渐渐地人们也不再有异议了。
到了19世纪,法国数学家柯西认识到,结论正确并不意味着体系完整,于是着手使“无穷小分析”严格化。这就是著名ε—N和ε—δ说法,这个说法到19世纪70年代才由魏尔斯特拉斯完成。这种寓动于静,表示极限过程的描述,把神秘化的外衣去掉了:所谓无穷小,不过是极限为0的变量而已。它不是“一个数”,而是一个变化过程,即不断向常数0以 误差可任意小进行逼近的一个变量。它的表示完全是算术化了的,ε,δ等的关系,明确无误,一目了然。然而,“无穷小”不是数,不能直接除,也不能忽略不 计,生动活泼的运算淹没在形式的海洋里,人们抱怨微积分越来越难学。工程学家不理会对无穷小的批评,仍然沿用牛顿—欧拉时代的方便做法,把“无穷小”拿在 手里不肯丢掉。不过,“无穷小”在数坛上终究呆不住,20世纪以来,几乎销声匿迹,偶尔提到它,也不过是习惯性的名词介绍而已。
1960年秋事情有了转机。数理逻辑学家阿伯拉罕·罗宾逊(Abraham Robinson,1918~1974,生于德国的犹太人,1962年去美国)在普林斯顿大学的一次报告中指出:现代数理逻辑的概念和方法能为“无穷小”和“无穷大”作为“数”进入微积分提供合适的框架。1961年,罗宾逊在荷兰阿姆斯特丹皇家科学院学报上发表文章,题为《非标准分析》,表明这一新数学分支已经呱呱坠地了。
在标准分析里,研究的有理数和无理数的集合称为实数集合。实数集合与直线上的点一一对应,实数的集合是连续的。在非标准分析里,罗宾逊的基本想法是:无穷 小既然不是一个“数”,即在实数集合中没有它的位置,那么我们是否能把实数集合扩大,使之成为新的超实数集合,而微积分在超实数集合中实施时,能够保持当 年牛顿—欧拉时代的直观和简便易行?罗宾逊用数理逻辑中模型论的方法做到了这一点。在超实数集合中,每一通常的实数是标准数,它的周围聚集着许多“无穷小 ”(非标准实数),就像电子围绕原子核一样。在超实数集合中没有阿基米德性质,即任取整数α和β,不一定都能找到自然数n,使nα>β,因为无穷小是大于0的非标准实数,它的任意整倍数仍是无穷小,不可能大于正标准数β。 从 “宏观”上看,超实数集合的数轴与实数集合的数轴一样。但是从“微观”上看并不相同,在超实数轴上的每一点内,有许多非标准实数。这些非标准实数彼此相差 无限小量,形成了一个有内部结构的点,称为“单子”,每个“单子”只有一个标准实数。从标准实数来看,点与点是连续的,从超实数轴来看,点与点是连续与间 断的对立统一。 从它的物理意义来说,如一条光线,从“宏观”看来,它是连续的,从“微观”看来不仅不连续,而且不均匀,量子理论证明了光具有波动和粒子二像性,正表明了光是连续与不连续的对立统一。 非 标准分析为我们打开了一个新的世界——“点”的世界。任何一个“点”,都是一个“世界”;任何一个世界,都是一个“点”,正如天外有天一样,点内又有点。 在太阳系中,地球是一个“点”,它是有结构的,可分的,同样分子可作为一个“点”,它有结构,是可分的。从数学上说,由更小的层次看来,在任何一个“点” 中,都可以建立坐标系,因为它是一个“世界”,由更大的层次看来,在任何一个“世界”都可以仅仅是坐标系的一点。非标准分析接受了“点”的可分性的辩证 法。 这 套数理逻辑的方法是相当烦琐的,要弄懂它比搞清微积分概念困难得多。但是无穷小毕竟堂而皇之地重返数坛,成为逻辑上站得住脚的数学中的一员,这是非标准分 析给我们带来的“革命”信息,是令人高兴的事情。从哲学上看,也自有它的意义。否定之否定,微积分学的基础又得到了新发展,真是“柳暗花明又一村!” 1965年4月,罗宾逊写了《非标准分析》一书,广为流传。许多数学家对此表示支持,也有许多人表示怀疑。1973年,罗宾逊在普林斯顿高等研究所遇到著名的哥德尔——本世纪最著名数理学家。哥德尔作了这样的评价: “ 非标准分析不但常常能够简化初等定理的证明,而且对简化艰深结论的证明也同样有效。例如,对于紧算子具有“不变子空间”的定理就能大大简化。……我们有理 由相信,不论从哪方面看,非标准分析将会成为未来的数学分析。……在未来世纪中,将要思量数学史中的一件大事,就是为什么在发明微积分学后300年,第一个严格的无限小理论才发展起来。”
哥德尔的评价使非标准分析更加受人重视。非标准的群论、非标准的泛函分析、非标准的拓扑,相继问世。基斯勒(Keisler) 写了一本非标准分析的微积分教科书,经过试教,据说接受情况良好,准备扩大试验。但是,对它抱怀疑态度的人最近越来越多。理由是“凡用非标准分析能得到的 结果,用原来的标准方法都能得到,既然没有新东西,本身又那样难懂,何必去学它呢?”更有人认为非标准分析不过是数理逻辑学家在“想入非非”、“见异思迁 ”,实在是多此一举。至于非标准分析是否能成为“未来世纪的数学分析”,恐怕要接受实践的检验,经受历史的考验。人们接受一种新事物需要一个过程,尤其对 于一种新说法、新装饰、更需要时间。要人们普遍使用非标准分析,简直就像让人去说另一门外语一样难。哥德尔的预言是否正确,且看将来吧!不过,罗宾逊使无 穷小再生的功绩将不会抹杀,在数学史上一定会有一席地位的。

一份中国学科分类国家标准,看看,就一个数学中的一个分支一个人一辈子都研究不完。其中也说明了,应用数学归为每个具体应用学科里面。除了专门数学专业的,其他专业的也只是学了其中在本学科需要的一小部分而已。
110 数学
a.. 110.11 数学史
b.. 110.14 数理逻辑与数学基础
a.. 110.1410 演绎逻辑学 亦称符号逻辑学
b.. 110.1420 证明论 亦称元数学
c.. 110.1430 递归论
d.. 110.1440 模型论
e.. 110.1450 公理集合论
f.. 110.1460 数学基础
g.. 110.1499 数理逻辑与数学基础其他学科
c.. 110.17 数论
a.. 110.1710 初等数论
b.. 110.1720 解析数论
c.. 110.1730 代数数论
d.. 110.1740 超越数论
e.. 110.1750 丢番图逼近
f.. 110.1760 数的几何
g.. 110.1770 概率数论
h.. 110.1780 计算数论
i.. 110.1799 数论其他学科
d.. 110.21 代数学
a.. 110.2110 线性代数
b.. 110.2115 群论
c.. 110.2120 域论
d.. 110.2125 李群
e.. 110.2130 李代数
f.. 110.2135 Kac-Moody代数
g.. 110.2140 环论 包括交换环与交换代数,结合环与结合代数,非结合环与非结
合代数等
h.. 110.2145 模论
i.. 110.2150 格论
j.. 110.2155 泛代数理论
k.. 110.2160 范畴论
l.. 110.2165 同调代数
m.. 110.2170 代数K理论
n.. 110.2175 微分代数
o.. 110.2180 代数编码理论
p.. 110.2199 代数学其他学科
e.. 110.24 代数几何学
f.. 110.27 几何学
a.. 110.2710 几何学基础
b.. 110.2715 欧氏几何学
c.. 110.2720 非欧几何学 包括黎曼几何学等
d.. 110.2725 球面几何学
e.. 110.2730 向量和张量分析
f.. 110.2735 仿射几何学
g.. 110.2740 射影几何学
h.. 110.2745 微分几何学
i.. 110.2750 分数维几何
j.. 110.2755 计算几何学
k.. 110.2799 几何学其他学科
g.. 110.31 拓扑学
a.. 110.3110 点集拓扑学
b.. 110.3115 代数拓扑学
c.. 110.3120 同伦论
d.. 110.3125 低维拓扑学
e.. 110.3130 同调论
f.. 110.3135 维数论
g.. 110.3140 格上拓扑学
h.. 110.3145 纤维丛论
i.. 110.3150 几何拓扑学
j.. 110.3155 奇点理论
k.. 110.3160 微分拓扑学
l.. 110.3199 拓扑学其他学科
h.. 110.34 数学分析
a.. 110.3410 微分学
b.. 110.3420 积分学
c.. 110.3430 级数论
d.. 110.3499 数学分析其他学科
i.. 110.37 非标准分析
j.. 110.41 函数论
a.. 110.4110 实变函数论
b.. 110.4120 单复变函数论
c.. 110.4130 多复变函数论
d.. 110.4140 函数逼近论
e.. 110.4150 调和分析
f.. 110.4160 复流形
g.. 110.4170 特殊函数论
h.. 110.4199 函数论其他学科
k.. 110.44 常微分方程
a.. 110.4410 定性理论
b.. 110.4420 稳定性理论
c.. 110.4430 解析理论
d.. 110.4499 常微分方程其他学科
l.. 110.47 偏微分方程
a.. 110.4710 椭圆型偏微分方程
b.. 110.4720 双曲型偏微分方程
c.. 110.4730 抛物型偏微分方程
d.. 110.4740 非线性偏微分方程
e.. 110.4799 偏微分方程其他学科
m.. 110.51 动力系统
a.. 110.5110 微分动力系统
b.. 110.5120 拓扑动力系统
c.. 110.5130 复动力系统
d.. 110.5199 动力系统其他学科
n.. 110.54 积分方程
o.. 110.57 泛函分析
a.. 110.5710 线性算子理论
b.. 110.5715 变分法
c.. 110.5720 拓扑线性空间
d.. 110.5725 希尔伯特空间
e.. 110.5730 函数空间
f.. 110.5735 巴拿赫空间
g.. 110.5740 算子代数
h.. 110.5745 测度与积分
i.. 110.5750 广义函数论
j.. 110.5755 非线性泛函分析
k.. 110.5799 泛函分析其他学科
p.. 110.61 计算数学
a.. 110.6110 插值法与逼近论
b.. 110.6120 常微分方程数值解
c.. 110.6130 偏微分方程数值解
d.. 110.6140 积分方程数值解
e.. 110.6150 数值代数
f.. 110.6160 连续问题离散化方法
g.. 110.6170 随机数值实验
h.. 110.6180 误差分析
i.. 110.6199 计算数学其他学科
q.. 110.64 概率论
a.. 110.6410 几何概率
b.. 110.6420 概率分布
c.. 110.6430 极限理论
d.. 110.6440 随机过程 包括正态过程与平稳过程、点过程等
e.. 110.6450 马尔可夫过程
f.. 110.6460 随机分析
g.. 110.6470 鞅论
h.. 110.6480 应用概率论 具体应用入有关学科
i.. 110.6499 概率论其他学科
r.. 110.67 数理统计学
a.. 110.6710 抽样理论 包括抽样分布、抽样调查等
b.. 110.6715 假设检验
c.. 110.6720 非参数统计
d.. 110.6725 方差分析
e.. 110.6730 相关回归分析
f.. 110.6735 统计推断
g.. 110.6740 贝叶斯统计 包括参数估计等
h.. 110.6745 试验设计
i.. 110.6750 多元分析
j.. 110.6755 统计判决理论
k.. 110.6760 时间序列分析
l.. 110.6799 数理统计学其他学科
s.. 110.71 应用统计数学
a.. 110.7110 统计质量控制
b.. 110.7120 可靠性数学
c.. 110.7130 保险数学
d.. 110.7140 统计模拟
t.. 110.7199 应用统计数学其他学科
u.. 110.74 运筹学
a.. 110.7410 线性规划
b.. 110.7415 非线性规划
c.. 110.7420 动态规划
d.. 110.7425 组合最优化
e.. 110.7430 参数规划
f.. 110.7435 整数规划
g.. 110.7440 随机规划
h.. 110.7445 排队论
i.. 110.7450 对策论 亦称博奕论
j.. 110.7455 库存论
k.. 110.7460 决策论
l.. 110.7465 搜索论
m.. 110.7470 图论
n.. 110.7475 统筹论
o.. 110.7480 最优化
p.. 110.7499 运筹学其他学科
v.. 110.77 组合数学
w.. 110.81 离散数学
x.. 110.84 模糊数学
y.. 110.87 应用数学 具体应用入有关学科
z.. 110.99 数学其他学科

Table of Contents
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这 样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的,在 linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。
awk [options] ’script’ var=value file(s)
awk [options] -f scriptfile var=value file(s)
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
赋值一个用户定义变量。
从脚本文件中读取awk命令。
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
打印简短的版权信息。
打印全部awk选项和每个选项的简短说明。
打印不能向传统unix平台移植的结构的警告。
打印关于不能向传统unix平台移植的结构的警告。
打开兼容模式。但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
使用program-text作为源代码,可与-f命令混用。
打印bug报告信息的版本。
pattern {action} 如$ awk ‘/root/’ test,或$ awk ‘$3 < 100′ test。
两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。
模式可以是以下任意一个:
/正则表达式/:使用通配符的扩展集。
关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。
模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
END:让用户在最后一条输入记录被读取之后发生的动作。
Table 1. awk的环境变量
| 变量 | 描述 |
|---|---|
| $n | 当前记录的第n个字段,字段间由FS分隔。 |
| $0 | 完整的输入记录。 |
| ARGC | 命令行参数的数目。 |
| ARGIND | 命令行中当前文件的位置(从0开始算)。 |
| ARGV | 包含命令行参数的数组。 |
| CONVFMT | 数字转换格式(默认值为%.6g) |
| ENVIRON | 环境变量关联数组。 |
| ERRNO | 最后一个系统错误的描述。 |
| FIELDWIDTHS | 字段宽度列表(用空格键分隔)。 |
| FILENAME | 当前文件名。 |
| FNR | 同NR,但相对于当前文件。 |
| FS | 字段分隔符(默认是任何空格)。 |
| IGNORECASE | 如果为真,则进行忽略大小写的匹配。 |
| NF | 当前记录中的字段数。 |
| NR | 当前记录数。 |
| OFMT | 数字的输出格式(默认值是%.6g)。 |
| OFS | 输出字段分隔符(默认值是一个空格)。 |
| ORS | 输出记录分隔符(默认值是一个换行符)。 |
| RLENGTH | 由match函数所匹配的字符串的长度。 |
| RS | 记录分隔符(默认是一个换行符)。 |
| RSTART | 由match函数所匹配的字符串的第一个位置。 |
| SUBSEP | 数组下标分隔符(默认值是\034)。 |
awk把每一个以换行符结束的行称为一个记录。
记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。
$0变量:它指的是整条记录。如$ awk ‘{print $0}’ test将输出test文件中的所有记录。
变量NR:一个计数器,每处理完一条记录,NR的值就增加1。如$ awk ‘{print NR,$0}’ test将输出test文件中所有记录,并在记录前显示记录号。
记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk ‘{print $1,$3}’ test将打印test文件中第一和第三个以空格分开的列(域)。
一般通用的元字符集就不讲了,可参考我的Sed和Grep学习笔记。以下几个是gawk专用的,不适合unix版本的awk。
匹配一个单词开头或者末尾的空字符串。
匹配单词内的空字符串。
匹配一个单词的开头的空字符串,锚定开始。
匹配一个单词的末尾的空字符串,锚定末尾。
匹配一个字母数字组成的单词。
匹配一个非字母数字组成的单词。
匹配字符串开头的一个空字符串。
匹配字符串末尾的一个空字符串。
可参考我的Grep学习笔记
conditional expression1 ? expression2: expression3,例如:$ awk ‘{max = {$1 > $3} ? $1: $3: print max}’ test。如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。
$ awk ‘$1 + $2 < 100′ test。如果第一和第二个域相加大于100,则打印这些行。
$ awk ‘$1 > 5 && $2 < 10′ test,如果第一个域大于5,并且第二个域小于10,则打印这些行。
范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ awk ‘/root/,/mysql/’ test将显示root第一次出现到mysql第一次出现之间的所有行。
<a name="co.1"></a><img src="http://www.linux.gov.cn/shell/awk_files/1.htm" alt="1" border="0" />$ cat /etc/passwd | awk -F: '\<br /><a name="co.2"></a><img src="http://www.linux.gov.cn/shell/awk_files/2.htm" alt="2" border="0" />NF != 7{\<br /><a name="co.3"></a><img src="http://www.linux.gov.cn/shell/awk_files/3.htm" alt="3" border="0" />printf("line %d,does not have 7 fields:%s\n",NR,$0)}\<br /><a name="co.4"></a><img src="http://www.linux.gov.cn/shell/awk_files/4.htm" alt="4" border="0" />$1 !~ /[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\<br /><a name="co.5"></a><img src="http://www.linux.gov.cn/shell/awk_files/5.htm" alt="5" border="0" />$2 == "*" {printf("line %d, no password: %s\n",NR,$0)}'<br /></pre><p> </p><div class="calloutlist"><table summary="Callout list" border="0"><tbody><tr><td align="left" valign="top" width="5%"><a href="http://www.linux.gov.cn/shell/awk.htm#co.1"><img src="http://www.linux.gov.cn/shell/awk_files/1.htm" alt="1" border="0" /></a> </td><td align="left" valign="top"><p>cat把结果输出给awk,awk把域之间的分隔符设为冒号。</p></td></tr><tr><td align="left" valign="top" width="5%"><a href="http://www.linux.gov.cn/shell/awk.htm#co.2"><img src="http://www.linux.gov.cn/shell/awk_files/2.htm" alt="2" border="0" /></a> </td><td align="left" valign="top"><p>如果域的数量(NF)不等于7,就执行下面的程序。</p></td></tr><tr><td align="left" valign="top" width="5%"><a href="http://www.linux.gov.cn/shell/awk.htm#co.3"><img src="http://www.linux.gov.cn/shell/awk_files/3.htm" alt="3" border="0" /></a> </td><td align="left" valign="top"><p>printf打印字符串"line ?? does not have 7 fields",并显示该条记录。</p></td></tr><tr><td align="left" valign="top" width="5%"><a href="http://www.linux.gov.cn/shell/awk.htm#co.4"><img src="http://www.linux.gov.cn/shell/awk_files/4.htm" alt="4" border="0" /></a> </td><td align="left" valign="top"><p>如果第一个域没有包含任何字母和数字,printf打印“no alpha and numeric user id" ,并显示记录数和记录。</p></td></tr><tr><td align="left" valign="top" width="5%"><a href="http://www.linux.gov.cn/shell/awk.htm#co.5"><img src="http://www.linux.gov.cn/shell/awk_files/5.htm" alt="5" border="0" /></a> </td><td align="left" valign="top"><p>如果第二个域是一个星号,就打印字符串“no passwd”,紧跟着显示记录数和记录本身。</p></td></tr></tbody></table></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="id2808705"></a>13. 几个实例</h2></div></div></div><div class="itemizedlist"><ul type="disc"><li><p>$ awk '/^(no|so)/' test-----打印所有以模式no或so开头的行。</p></li><li><p>$ awk '/^[ns]/{print $1}' test-----如果记录以n或s开头,就打印这个记录。</p></li><li><p>$ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一个域以两个数字结束就打印这个记录。</p></li><li><p>$ awk '$1 == 100 || $2 < 50' test-----如果第一个或等于100或者第二个域小于50,则打印该行。</p></li><li><p>$ awk '$1 != 10' test-----如果第一个域不等于10就打印该行。</p></li><li><p>$ awk '/test/{print $1 + 10}' test-----如果记录包含正则表达式test,则第一个域加10并打印出来。</p></li><li><p>$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。</p></li><li><p>$ awk '/^root/,/^mysql/' test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记 录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。</p></li></ul></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="id2808824"></a>14. awk编程</h2></div></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2808832"></a>14.1. 变量</h3></div></div></div><div class="itemizedlist"><ul type="disc"><li><p>在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串。</p></li><li><p>赋 值格式:Variable = expression,如$ awk '$1 ~/test/{count = $2 + $3; print count}' test,上式的作用是,awk先扫描第一个域,一旦test匹配,就把第二个域的值加上第三个域的值,并把结果赋值给变量count,最后打印出来。</p></li><li><p>awk 可以在命令行中给变量赋值,然后将这个变量传输给awk脚本。如$ awk -F: -f awkscript month=4 year=2004 test,上式的month和year都是自定义变量,分别被赋值为4和2004。在awk脚本中,这些变量使用起来就象是在脚本中建立的一样。注意,如 果参数前面出现test,那么在BEGIN语句中的变量就不能被使用。</p></li><li><p>域变量也可被赋值和修改,如$ awk '{$2 = 100 + $1; print }' test,上式表示,如果第二个域不存在,awk将计算表达式100加$1的值,并将其赋值给$2,如果第二个域存在,则用表达式的值覆盖$2原来的值。 再例如:$ awk '$1 == "root"{$1 ="test";print}' test,如果第一个域的值是“root”,则把它赋值为“test”,注意,字符串一定要用双引号。</p></li><li><p>内建变量的使用。 变量列表在前面已列出,现在举个例子说明一下。$ awk -F: '{IGNORECASE=1; $1 == "MARY"{print NR,$1,$2,$NF}'test,把IGNORECASE设为1代表忽略大小写,打印第一个域是mary的记录数、第一个域、第二个域和最后一个 域。</p></li></ul></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2808925"></a>14.2. BEGIN模块</h3></div></div></div><p>BEGIN 模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS, RS和FS等,以及打印标题。如:$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个 换行符。$ awk 'BEGIN{print "TITLE TEST"}只打印标题。</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2808950"></a>14.3. END模块</h3></div></div></div><p>END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk 'END{print "The number of records is" NR}' test,上式将打印所有被处理的记录数。</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2808971"></a>14.4. 重定向和管道</h3></div></div></div><div class="itemizedlist"><ul type="disc"><li><p>awk 可使用shell的重定向符进行重定向输出,如:$ awk '$1 = 100 {print $1 > "output_file" }' test。上式表示如果第一个域的值等于100,则把它输出到output_file中。也可以用>>来重定向输出,但不清空文件,只做追加 操作。</p></li><li><p>输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件 获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返 回0,如果出现错误,例如打开文件失败,就返回-1。如:</p><p>$ awk 'BEGIN{ "date" | getline d; print d}' test。执行linux的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。</p><p>$ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test。执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给d,split函数把变量d转 化成数组mon,然后打印数组mon的第二个元素。</p><p>$ awk 'BEGIN{while( "ls" | getline) print}',命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为 BEGIN块在打开输入文件前执行,所以可以忽略输入文件。</p><p>$ awk 'BEGIN{printf "What is your name?"; getline name < "/dev/tty" } $1 ~name {print "Found" name on line ", NR "."} END{print "See you," name "."} test。在屏幕上打印”What is your name?",并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。如果第一个域匹配变量 name的值,print函数就被执行,END块打印See you和name的值。</p><p>$ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'。awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值。注意,如果文件不存 在,getline返回-1,如果到达文件的末尾就返回0,如果读到一行,就返回1,所以命令 while (getline < "/etc/passwd")在文件不存在的情况下将陷入无限循环,因为返回-1表示逻辑真。</p></li><li><p>可以在awk中打开一个管 道,且同一时刻只能有一个管道存在。通过close()可关闭管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}。awd把print语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。</p></li><li><p>system函数可以在awk中执行linux的命令。如:$ awk 'BEGIN{system("clear")'。</p></li><li><p>fflush函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓冲区,如果以空字符串为参数,如fflush(""),则刷新所有文件和管道的输出缓冲区。</p></li></ul></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2809145"></a>14.5. 条件语句</h3></div></div></div><p>awk中的条件语句是从C语言中借鉴过来的,可控制程序的流程。</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2809159"></a>14.5.1. if语句</h4></div></div></div><pre class="screen">格式:<br /> {if (expression){<br /> statement; statement; ...<br /> }<br /> }</pre><p>$ awk '{if ($1 <$2) print $2 "too high"}' test。如果第一个域小于第二个域则打印。</p><p>$ awk '{if ($1 < $2) {count++; print "ok"}}' test.如果第一个域小于第二个域,则count加一,并打印ok。</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2809192"></a>14.5.2. if/else语句,用于双重判断。</h4></div></div></div><pre class="screen">格式:<br /> {if (expression){<br /> statement; statement; ...<br /> }<br /> else{<br /> statement; statement; ...<br /> }<br /> }</pre><p>$ awk '{if ($1 > 100) print $1 "bad" ; else print "ok"}' test。如果$1大于100则打印$1 bad,否则打印ok。</p><p>$ awk '{if ($1 > 100){ count++; print $1} else {count--; print $2}' test。如果$1大于100,则count加一,并打印$1,否则count减一,并打印$1。</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2809231"></a>14.5.3. if/else else if语句,用于多重判断。</h4></div></div></div><pre class="screen">格式:<br /> {if (expression){<br /> statement; statement; ...<br /> }<br /> else if (expression){<br /> statement; statement; ...<br /> }<br /> else if (expression){<br /> statement; statement; ...<br /> }<br /> else {<br /> statement; statement; ...<br /> }<br /> }</pre></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2809263"></a>14.6. 循环</h3></div></div></div><div class="itemizedlist"><ul type="disc"><li><p>awk有三种循环:while循环;for循环;special for循环。</p></li><li><p>$ awk '{ i = 1; while ( i <= NF ) { print NF,$i; i++}}' test。变量的初始值为1,若i小于可等于NF(记录中域的个数),则执行打印语句,且i增加1。直到i的值大于NF.</p></li><li><p>$ awk '{for (i = 1; i<NF; i++) print NF,$i}' test。作用同上。</p></li><li><p>breadkcontinue语句。break用于在满足条件的情况下跳出循环;continue用于在满足条件的情况下忽略后面的语句,直接返回循环的顶端。如:</p><pre class="screen">{for ( x=3; x<=NF; x++) <br /> if ($x<0){print "Bottomed out!"; break}}<br />{for ( x=3; x<=NF; x++)<br /> if ($x==0){print "Get next item"; continue}}<br /> </pre></li><li><p>next语句从输入文件中读取一行,然后从头开始执行awk脚本。如:</p><pre class="screen">{if ($1 ~/test/){next}<br /> else {print}<br />}<br /> </pre></li><li><p>exit语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错。</p></li></ul></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2809375"></a>14.7. 数组</h3></div></div></div><p>awk中的数组的下标可以是数字和字母,称为关联数组。</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2809389"></a>14.7.1. 下标与关联数组</h4></div></div></div><div class="itemizedlist"><ul type="disc"><li><p>用 变量作为数组下标。如:$ awk {name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' test。数组name中的下标是一个自定义变量x,awk初始化x的值为0,在每次使用后增加1。第二个域的值被赋给name数组的各个元素。在END 模块中,for循环被用于循环整个数组,从下标为0的元素开始,打印那些存储在数组中的值。因为下标是关健字,所以它不一定从0开始,可以从任何值开始。</p></li><li><p>special for循环用于读取关联数组中的元素。格式如下:</p><pre class="screen">{for (item in arrayname){<br /> print arrayname[item]<br /> }<br />}<br /></pre> $ awk '/^tom/{name[NR]=$1}; END{for(i in name){print name[i]}}' test。打印有值的数组元素。打印的顺序是随机的。 </li><li><p>用字符串作为下标。如:count["test"]</p></li><li><p>用 域值作为数组的下标。一种新的for循环方式,for (index_value in array) statement。如:$ awk '{count[$1]++} END{for(name in count) print name,count[name]}' test。该语句将打印$1中字符串出现的次数。它首先以第一个域作数组count的下标,第一个域变化,索引就变化。</p></li><li><p>delete 函数用于删除数组元素。如:$ awk '{line[x++]=$1} END{for(x in line) delete(line[x])}' test。分配给数组line的是第一个域的值,所有记录处理完成后,special for循环将删除每一个元素。</p></li></ul></div></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2809497"></a>14.8. awk的内建函数</h3></div></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2809505"></a>14.8.1. 字符串函数</h4></div></div></div><div class="itemizedlist"><ul type="disc"><li><p>sub函数匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:</p><pre class="screen"> sub (regular expression, substitution string):<br /> sub (regular expression, substitution string, target string)<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ sub(/test/, "mytest"); print }' testfile<br /> $ awk '{ sub(/test/, "mytest"); $1}; print }' testfile<br /></pre><p>第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。如要在整个文件中进行匹配需要用到gsub</p><p>第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。</p></li><li><p>gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:</p><pre class="screen"> gsub (regular expression, substitution string)<br /> gsub (regular expression, substitution string, target string)<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ gsub(/test/, "mytest"); print }' testfile<br /> $ awk '{ gsub(/test/, "mytest"), $1 }; print }' testfile<br /></pre><p>第一个例子在整个文档中匹配test,匹配的都被替换成mytest。</p><p>第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。</p></li><li><p>index函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。格式如下:</p><pre class="screen"> index(string, substring)<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ print index("test", "mytest") }' testfile<br /></pre><p>实例返回test在mytest的位置,结果应该是3。</p></li><li><p>length函数返回记录的字符数。格式如下:</p><pre class="screen"> length( string )<br /> length<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ print length( "test" ) }' <br /> $ awk '{ print length }' testfile<br /></pre><p>第一个实例返回test字符串的长度。</p><p>第二个实例返回testfile文件中第条记录的字符数。</p></li><li><p>substr函数返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串。格式如下:</p><pre class="screen"> substr( string, starting position )<br /> substr( string, starting position, length of string )<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ print substr( "hello world", 7,11 ) }' <br /></pre><p>上例截取了world子字符串。</p></li><li><p>match函数返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。函数格式如下:</p><pre class="screen"> match( string, regular expression )<br /></pre><p>实例:</p><pre class="screen"> $ awk '{start=match("this is a test",/[a-z]+$/); print start}'<br /> $ awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'<br /></pre><p>第一个实例打印以连续小写字符结尾的开始位置,这里是11。</p><p>第二个实例还打印RSTART和RLENGTH变量,这里是11(start),11(RSTART),4(RLENGTH)。</p></li><li><p>toupper和tolower函数可用于字符串大小间的转换,该功能只在gawk中有效。格式如下:</p><pre class="screen"> toupper( string )<br /> tolower( string )<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ print toupper("test"), tolower("TEST") }'<br /></pre></li><li><p>split函数可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。格式如下:</p><pre class="screen"> split( string, array, field separator )<br /> split( string, array )<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ split( "20:18:00", time, ":" ); print time[2] }'<br /></pre><p>上例把时间按冒号分割到time数组内,并显示第二个数组元素18。</p></li></ul></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2875740"></a>14.8.2. 时间函数</h4></div></div></div><div class="itemizedlist"><ul type="disc"><li><p>systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数。格式如下:</p><pre class="screen"> systime()<br /></pre><p>实例:</p><pre class="screen"> $ awk '{ now = systime(); print now }'<br /></pre></li><li><p>strftime函数使用C库中的strftime函数格式化时间。格式如下:</p><pre class="screen"> systime( [format specification][,timestamp] )<br /></pre><div class="table"><a name="id2875802"></a><p class="title"><b>Table 3. 日期和时间格式说明符</b></p><table summary="日期和时间格式说明符" border="1"><colgroup><col><col></colgroup><thead><tr><th>格式</th><th>描述</th></tr></thead><tbody><tr><td>%a</td><td>星期几的缩写(Sun)</td></tr><tr><td>%A</td><td>星期几的完整写法(Sunday)</td></tr><tr><td>%b</td><td>月名的缩写(Oct)</td></tr><tr><td>%B</td><td>月名的完整写法(October)</td></tr><tr><td>%c</td><td>本地日期和时间</td></tr><tr><td>%d</td><td>十进制日期</td></tr><tr><td>%D</td><td>日期 08/20/99</td></tr><tr><td>%e</td><td>日期,如果只有一位会补上一个空格</td></tr><tr><td>%H</td><td>用十进制表示24小时格式的小时</td></tr><tr><td>%I</td><td>用十进制表示12小时格式的小时</td></tr><tr><td>%j</td><td>从1月1日起一年中的第几天</td></tr><tr><td>%m</td><td>十进制表示的月份</td></tr><tr><td>%M</td><td>十进制表示的分钟</td></tr><tr><td>%p</td><td>12小时表示法(AM/PM)</td></tr><tr><td>%S</td><td>十进制表示的秒</td></tr><tr><td>%U</td><td>十进制表示的一年中的第几个星期(星期天作为一个星期的开始)</td></tr><tr><td>%w</td><td>十进制表示的星期几(星期天是0)</td></tr><tr><td>%W</td><td>十进制表示的一年中的第几个星期(星期一作为一个星期的开始)</td></tr><tr><td>%x</td><td>重新设置本地日期(08/20/99)</td></tr><tr><td>%X</td><td>重新设置本地时间(12:00:00)</td></tr><tr><td>%y</td><td>两位数字表示的年(99)</td></tr><tr><td>%Y</td><td>当前月份</td></tr><tr><td>%Z</td><td>时区(PDT)</td></tr><tr><td>%%</td><td>百分号(%)</td></tr></tbody></table></div><p>实例:</p><pre class="screen"> $ awk '{ now=strftime( "%D", systime() ); print now }'<br /> $ awk '{ now=strftime("%m/%d/%y"); print now }'<br /></pre></li></ul></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2876170"></a>14.8.3. 内建数学函数</h4></div></div></div><div class="table"><a name="id2876177"></a><p class="title"><b>Table 4. </b></p><table summary="" border="1"><colgroup><col><col></colgroup><thead><tr><th>函数名称</th><th>返回值</th></tr></thead><tbody><tr><td>atan2(x,y)</td><td>y,x范围内的余切</td></tr><tr><td>cos(x)</td><td>余弦函数</td></tr><tr><td>exp(x)</td><td>求幂</td></tr><tr><td>int(x)</td><td>取整</td></tr><tr><td>log(x)</td><td>自然对数</td></tr><tr><td>rand()</td><td>随机数</td></tr><tr><td>sin(x)</td><td>正弦</td></tr><tr><td>sqrt(x)</td><td>平方根</td></tr><tr><td>srand(x)</td><td>x是rand()函数的种子</td></tr><tr><td>int(x)</td><td>取整,过程没有舍入</td></tr><tr><td>rand()</td><td>产生一个大于等于0而小于1的随机数</td></tr></tbody></table></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2876353"></a>14.8.4. 自定义函数</h4></div></div></div><p>在awk中还可自定义函数,格式如下:</p><pre class="screen"> function name ( parameter, parameter, parameter, ... ) {<br /> statements<br /> return expression # the return statement and expression are optional<br /> }<br />

awk提供了许多强大的字符串函数,见下表:
awk内置字符串函数
| gsub(r,s) | 在整个$0中用s替代r |
| gsub(r,s,t) | 在整个t中用s替代r |
| index(s,t) | 返回s中字符串t的第一位置 |
| length(s) | 返回s长度 |
| match(s,r) | 测试s是否包含匹配r的字符串 |
| split(s,a,fs) | 在fs上将s分成序列a |
| sprint(fmt,exp) | 返回经fmt格式化后的exp |
| sub(r,s) | 用$0中最左边最长的子串代替s |
| substr(s,p) | 返回字符串s中从p开始的后缀部分 |
| substr(s,p,n) | 返回字符串s中从p开始长度为n的后缀部分 |
详细说明一下各个函数的使用方法。
gsub函数有点类似于sed查找和替换。它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行。第一个函数作用于记录$0,第二个gsub函数允许指定目标,然而,如果未指定目标,缺省为$0。
index(s,t)函数返回目标字符串s中查询字符串t的首位置。length函数返回字符串s字符
长度。match函数测试字符串s是否包含一个正则表达式r定义的匹配。split使用域分隔符fs将
字符串s划分为指定序列a。sprint函数类似于printf函数(以后涉及),返回基本输出格式fmt的
结果字符串exp。sub(r,s)函数将用s替代$0中最左边最长的子串,该子串被(r)匹配。
sub(s,p)返回字符串s在位置p后的后缀。substr(s,p,n)同上,并指定子串长度为n。
现在看一看awk中这些字符串函数的功能。
1.gsub
要在整个记录中替换一个字符串为另一个,使用正则表达式格式,/目标模式/,替换模式
/。例如改变学生序号4842到4899:
$ awk ‘gsub(’4842/, 4899) {print $0}’ grade.txt
J.Troll 07/99 4899 Brown-3 12 26 26
2.index
查询字符串s中t出现的第一位置。必须用双引号将字符串括起来。例如返回目标字符串
Bunny中ny出现的第一位置,即字符个数。
$ awk ‘BEGIN {print index(”Bunny”, “ny”)} grade.txt
4
3.length
返回所需字符串长度,例如检验字符串J.Troll返回名字及其长度,即人名构成的字符个
数。
$ awk ‘$1==”J.Troll” {print length($1) ” “$1}’ grade.txt
7 J.Troll
还有一种方法,这里字符串加双引号。
$ awk ‘BEGIN {print length(”A FEW GOOD MEN”)}’
14
4.match
match测试目标字符串是否包含查找字符的一部分。可以对查找部分使用正则表达式,返
回值为成功出现的字符排列数。如果未找到,返回0,第一个例子在ANCD中查找d。因其不
存在,所以返回0。第二个例子在ANCD中查找D。因其存在,所以返回ANCD中D出现的首位
置字符数。第三个例子在学生J.Lulu中查找u。
$ awk ‘{BEGIN {print match(”ANCD”, /d/)}’
0
$ awk ‘{BEGIN {print match(”ANCD”, /C/)}’
3
$ awk ‘$1==”J.Lulu” {print match($1, “u”)} grade.txt
4
5.split
使用split返回字符串数组元素个数。工作方式如下:如果有一字符串,包含一指定分隔
符-,例如AD2-KP9-JU2-LP-1,将之划分成一个数组。使用split,指定分隔符及数组名。此
例中,命令格式为(”AD2-KP9-JU2-LP-1″,parts_array,”-”),split然后返回数组下标数,这
里结果为4。
还有一个例子使用不同的分隔符。
$ awk ‘{BEGIN {print split(”123#456#678″, myarray, “#”)}’
3
这个例子中,split返回数组myarray的下标数。数组myarray取值如下:
Myarray[1]=”123″
Myarray[2]=”456″
Myarray[3]=”789″
6.sub
使用sub发现并替换模式的第一次出现位置。字符串STR包含‘popedpopopill’,执行下
列sub命令sub(/op/,”op”,STR)。模式op第一次出现时,进行替换操作,返回结果如下:
‘pOPedpopepill’。
假如grade.txt文件中,学生J.Troll的记录有两个值一样,“目前级别分”与“最高级别分”。只
改变第一个为29,第二个仍为24不动,操作命令为sub(/26/,”29″,$0),只替换第一个出现
24的位置。
$ awk ‘$1==”J.Troll” sub(/26/, “29″, $0)’ grade.txt
L.Troll 07/99 4842 Brown-3 12 29 26
L.Transley 05/99 4712 Brown-2 12 30 28
7.substr
substr是一个很有用的函数。它按照起始位置及长度返回字符串的一部分。例子如下:
$ awk ‘$1==”L.Transley” {print substr($1, 1,5)}’ grade.txt
L.Tan
上面例子中,指定在域1的第一个字符开始,返回其前面5个字符。
如果给定长度值远大于字符串长度, awk将从起始位置返回所有字符,要抽取L.Tansley的姓,只需从第3个字符开始返回长度为7。可以输入长度99,awk返回结果相同。
$ awk ‘{$1==”L.Transley” {print substr($1, 3,99)}’ grade.txt
Transley
substr的另一种形式是返回字符串后缀或指定位置后面字符。这里需要给出指定字符串及其返回字串的起始位置。例如,从文本文件中抽取姓氏,需操作域1,并从第三个字符开始:
$ awk ‘{print substr($1, 3)}’ grade.txt
Troll
Transley
还有一个例子,在BEGIN部分定义字符串,在END部分返回从第t个字符开始抽取的子串。
$ awk ‘{BEGIN STR=”A FEW GOOD MEN”} END {print substr(STR,7)) grade.txt
GOOD MEN
8.从shell中向awk传入字符串
awk脚本大多只有一行,其中很少是字符串表示的,这一点通过将变量传入awk命令行会变得很容易。现就其基本原理讲述一些例子。
使用管道将字符串stand-by传入awk,返回其长度。
$ echo “Stand-by” | awk ‘{print length($0)}’
8
设置文件名为一变量,管道输出到awk,返回不带扩展名的文件名。
$ STR=”mydoc.txt”
$ echo $STR | awk ‘{print subst($STR, 1, 5)}’
mydoc
设置文件名为一变量,管道输出到awk,只返回其扩展名。
$ STR=”mydoc.txt”
$ echo $STR | awk ‘{print substr($STR, 7)}’
txt

| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
|---|---|---|---|---|---|---|
| « 6 | ||||||
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||