|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
员工 46026 和 46027 没有住在亚利桑那州;但是他们的名字中包含所搜索的字符序列。切记,当在 AWK 中进行模式匹配时,例如 grep、sed 或者大部分其他 Linux/Unix 命令,将在记录(行)中的任何位置查找匹配,除非指定进行其他操作。为解决这一问题,必须将搜索与特定字段联系起来。通过利用代字号 (?) 以及对特定字段的说明,可以达到这一目的,如下例所示: $ awk \\\'$5 ? /AR/\\\' emp_names 46019 BOGUE ROBERT PHOENIX AZ 46021 JUNE MICAH PHOENIX AZ 46022 KANE SHERYL UNKNOWN AZ $ 代字号(表示匹配)的对应符号是一个前面带有感叹号的代字号 (!?)。这些字符通知程序,假如搜索序列没有出现在指定字段中,则找出与搜索序列相匹配的所有行: $ awk \\\'$5 !? /AR/\\\' names 46012 DULANEY EVAN MOBILE AL 46013 DURHAM JEFF MOBILE AL 46015 STEEN BILL MOBILE AL 46017 FELDMAN EVAN MOBILE AL 46018 SWIM STEVE UNKNOWN AL 46024 WOOD WILLIAM MUNCIE IN 46026 FERGUS SARAH MUNCIE IN 46027 BUCK SARAH MUNCIE IN 46029 TUTTLE BOB MUNCIE IN $ 在这种情况下,将显示第五个字段中没有 AR 的所有行 ― 包括两个 Sarah 条目,这两个条目确实包含 AR,但却是在第三个字段而不是第五个字段中。 花括号和字段分隔符 括号字符在 AWK 命令中起着很重要的作用。出现在括号之间的操作指出将要发生什么以及何时发生。当只使用一对括号时: {print $3,$2} 括号间的所有操作同时发生。当使用多于一对的括号时: {print $3}{print $2} 执行第一组命令,在该命令完成后执行第二组命令。注重以下两列清单的区别: $ awk \\\'{print $3,$2}\\\' names EVAN DULANEY JEFF DURHAM BILL STEEN EVAN FELDMAN STEVE SWIM ROBERT BOGUE MICAH JUNE SHERYL KANE WILLIAM WOOD SARAH FERGUS SARAH BUCK BOB TUTTLE $ $ awk \\\'{print $3}{print $2}\\\' names EVAN DULANEY JEFF DURHAM BILL STEEN EVAN FELDMAN STEVE SWIM ROBERT BOGUE MICAH JUNE SHERYL KANE WILLIAM WOOD SARAH FERGUS SARAH BUCK BOB TUTTLE $ 要利用多组括号进行重复查找,执行第一组中的命令直到完成为止;然后处理第二组命令。假如有第三组命令,则在第二组命令完成后执行它,以此类推。在所生成的打印输出中,有两个分隔的打印命令,因此先执行第一个命令,随后执行第二个命令,这样导致每个条目显示在两行而不是一行中。 区分两个字段的字段分隔符不一定始终是空格;它可以是任何可识别的字符。为进行演示,假定 emp_names 文件利用冒号而不是制表符来分隔字段: $ cat emp_names 46012:DULANEY:EVAN:MOBILE:AL 46013:DURHAM:JEFF:MOBILE:AL 46015:STEEN:BILL:MOBILE:AL 46017:FELDMAN:EVAN:MOBILE:AL 46018:SWIM:STEVE:UNKNOWN:AL 46019:BOGUE:ROBERT:PHOENIX:AZ 46021:JUNE:MICAH:PHOENIX:AZ 46022:KANE:SHERYL:UNKNOWN:AR 46024:WOOD:WILLIAM:MUNCIE:IN 46026:FERGUS:SARAH:MUNCIE:IN 46027:BUCK:SARAH:MUNCIE:IN 46029:TUTTLE:BOB:MUNCIE:IN $ 假如试图通过指定所需要的第二个字段来打印姓氏 $ awk \\\'{print $2}\\\' emp_names 您最后会得到十二个空行。因为文件中没有空格,除了第一个字段之外没有可认别的字段。为解决这一问题,必须通知 AWK 是空格之外的另一个字符作为分隔符,有两种方式可通知 AWK 使用新的字段分隔符:使用命令行参数 -F,或在程序中指定变量 FS。两种方式的效果一样,只有一种例外情况,如下例所示: $ awk \\\'{FS=":"}{print $2}\\\' emp_names DURHAM STEEN FELDMAN SWIM BOGUE JUNE KANE WOOD FERGUS BUCK TUTTLE $ $ awk -F: \\\'{print $2}\\\' emp_names DULANEY DURHAM STEEN FELDMAN SWIM BOGUE JUNE KANE WOOD FERGUS BUCK TUTTLE $ 在第一个命令中,头一条记录返回不准确的空行,而其他结果准确。直到读取第二条记录时,才识别字段分隔符并准确地执行。通过使用 BEGIN 语句可以纠正这一缺点(在后文详述)。-F 的功能异常类似于 BEGIN,能够准确地读取第一条记录并按要求执行。 在本文开始处我曾提到,默认的显示/输出字段分隔符是空格。通过使用输出字段分隔符 (OFS) 变量,可以在程序中更改此特性。例如,要读取文件(由冒号分隔)并以短划线显示,则命令是 $ awk -F":" \\\'{OFS="-"}{print $1,$2,$3,$4,$5}\\\' emp_names 46012-DULANEY-EVAN-MOBILE-AL 46013-DURHAM-JEFF-MOBILE-AL 46015-STEEN-BILL-MOBILE-AL 46017-FELDMAN-EVAN-MOBILE-AL 46018-SWIM-STEVE-UNKNOWN-AL 46019-BOGUE-ROBERT-PHOENIX-AZ 46021-JUNE-MICAH-PHOENIX-AZ 46022-KANE-SHERYL-UNKNOWN-AR 46024-WOOD-WILLIAM-MUNCIE-IN 46026-FERGUS-SARAH-MUNCIE-IN 46027-BUCK-SARAH-MUNCIE-IN 46029-TUTTLE-BOB-MUNCIE-IN $ FS 和 OFS 是(输入)字段分隔符和输出字段分隔符,它们只是一对可以在 AWK 实用工具中使用的变量。例如,要在打印时为每行编号,可以采用以下方法使用 NR 变量: $ awk -F":" \\\'{print NR,$1,$2,$3}\\\' emp_names 1 46012 DULANEY EVAN 2 46013 DURHAM JEFF 3 46015 STEEN BILL 4 46017 FELDMAN EVAN 5 46018 SWIM STEVE 6 46019 BOGUE ROBERT 7 46021 JUNE MICAH 8 46022 KANE SHERYL 9 46024 WOOD WILLIAM 10 46026 FERGUS SARAH 11 46027 BUCK SARAH 12 46029 TUTTLE BOB $ 找出员工号码处于 46012 和 46015 之间的所有行: $ awk -F":" \\\'/4601[2-5]/\\\' emp_names 46012 DULANEY EVAN MOBILE AL 46013 DURHAM JEFF MOBILE AL 46015 STEEN BILL MOBILE AL $ 添加文本 可以按照添加控制序列或其他字符的一样方法将文本添加到显示中。例如,要将分隔符从空格改为冒号,则命令是 awk \\\'{print $1":"$2":"$3":"$4":"$5}\\\' emp_names > new_emp_names 在这种情况下,字符 (:) 包含在引号 ("/") 中,它被添加到每个字段之间。在引号之间的值可以是任何内容。例如,创建一个关于居住在阿拉巴马州的员工的外观类似数据库的显示: $ awk \\\'$5 ~ /AL/ {print "NAME: "$2", "$3"nCITY-STATE: "$4", "$5"n"}\\\' emp_names NAME: DULANEY, EVAN CITY-STATE: MOBILE, AL NAME: DURHAM, JEFF CITY-STATE: MOBILE, AL NAME: STEEN, BILL CITY-STATE: MOBILE, AL NAME: FELDMAN, EVAN CITY-STATE: MOBILE, AL NAME: SWIM, STEVE CITY-STATE: UNKNOWN, AL $ 数学操作 AWK 除了提供文本功能,还提供全部范围的算术操作符,包括以下符号: + 将数字相加 - 减 * 乘 / 除 ^ 执行指数运算 % 提供模 ++ 将变量值加一 += 将其他操作的结果分配给变量 ― 将变量减一 -= 将减法操作的结果分配给变量 *= 分配乘法操作的结果 /= 分配除法操作的结果 %= 分配求模操作的结果 例如,假定您的机器上存在以下的文件,具体地列出硬件商店中的物品: $ cat inventory hammers 5 7.99 drills 2 29.99 punches 7 3.59 drifts 2 4.09 bits 55 1.19 saws 123 14.99 nails 800 .19 screws 80 .29 brads 100 .24 $ 第一项业务定单是通过将第二个字段(数量)的值乘以第三个字段(价格)的值,计算每种物品的库存价值: $ awk \\\'{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3}\\\' inventory hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95 drills QTY: 2 PRICE: 29.99 TOTAL: 59.98 punches QTY: 7 PRICE: 3.59 TOTAL: 25.13 drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18 bits QTY: 55 PRICE: 1.19 TOTAL: 65.45 saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77 nails QTY: 800 PRICE: .19 TOTAL: 152 screws QTY: 80 PRICE: .29 TOTAL: 23.2 brads QTY: 100 PRICE: .24 TOTAL: 24 $ 假如这些行本身并不重要,您只是希望确定商店中有多少件物品,则可以分配一个普通变量,按照每条记录中的物品数量增加: $ awk \\\'{x=x+$2} {print x}\\\' inventory 5 7 14 16 71 194 994 1074 1174 $ 根据这一数据,商店中有 1174 件物品。第一次执行时,变量 x 没有值,因此它采用第一行第二个字段的值。第二次执行时,它保留了第一行的值并加上第二行的值,以此类推,直到达到累计的总合。 可以应用一样的过程来确定现有库存的总价值: $ awk \\\'{x=x+($2*$3)} {print x}\\\' inventory 39.95 99.93 125.06 133.24 198.69 2042.46 2194.46 2217.66 2241.66 $ 返回类别: 教程 上一教程: WINDOWS 2000下修改注册表加强安全 下一教程: 解决OFFICE WORD“行距不等”问题 您可以阅读与"AWK:LINUX治理员的智能工具包(二)"相关的教程: · AWK:LINUX治理员的智能工具包(三) · AWK:LINUX治理员的智能工具包(一) · Google视频上载工具可兼容Mac,Linux · 打造电脑万能专家:“以一当十”的工具包 · 合理设置Word 2000的智能粘贴功能 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |