• awk精简教材


    awk就不多介绍了,最优秀的文本处理工具之一

    一、内置变量表

    属性 说明
    $0 当前记录(作为单个变量)
    $1~$n 当前记录的第n个字段,字段间由FS分隔
    FS 输入字段分隔符 默认是空格
    NF 当前记录中的字段个数,就是有多少列
    NR 已经读出的记录数,就是行号,从1开始
    RS 输入的记录他隔符默 认为换行符
    OFS 输出字段分隔符 默认也是空格
    ORS 输出的记录分隔符,默认为换行符
    ARGC 命令行参数个数
    ARGV 命令行参数数组
    FILENAME 当前输入文件的名字
    IGNORECASE 如果为真,则进行忽略大小写的匹配
    ARGIND 当前被处理文件的ARGV标志符
    CONVFMT 数字转换格式 %.6g
    ENVIRON UNIX环境变量
    ERRNO UNIX系统错误消息
    FIELDWIDTHS 输入字段宽度的空白分隔字符串
    FNR 当前记录数
    OFMT 数字的输出格式 %.6g
    RSTART 被匹配函数匹配的字符串首
    RLENGTH 被匹配函数匹配的字符串长度
    SUBSEP 34
    1. awk脚本是由模式和操作组成的:

    pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test。

    两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。

    模式可以是以下任意一个:

    • /正则表达式/:使用通配符的扩展集。

    • 关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

    • 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

    • 模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。

    • BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

    • END:让用户在最后一条输入记录被读取之后发生的动作。

    awk有三种循环:while循环;for循环;special for循环。

    • $ awk '{ i = 1; while ( i <= NF ) { print NF,$i; i++}}' test。变量的初始值为1,若i小于可等于NF(记录中域的个数),则执行打印语句,且i增加1。直到i的值大于NF.

    • $ awk '{for (i = 1; i<NF; i++) print NF,$i}' test。作用同上。

    • breadkcontinue语句。break用于在满足条件的情况下跳出循环;continue用于在满足条件的情况下忽略后面的语句,直接返回循环的顶端。如:

      {for ( x=3; x<=NF; x++) 
                  if ($x<0){print "Bottomed out!"; break}}
      {for ( x=3; x<=NF; x++)
                  if ($x==0){print "Get next item"; continue}}

    paste -d " " file1 file2   逐行合并两个文件

    awk '{getline f2 < "file_2"; print $0" "f2}' file_1

    求交集

    sort file_1 file_2 |uniq -d

    任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

    累计第二列的和

    awk '{a=a+$2}END{print a}'  file

    显示文件中第一个域匹配101的行(记录)。

    awk '$1~/101/ {print $1}' file

    awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+.[0-9]*/){total += $1; len++}} END{print total/len}' a
    (分析:$1~/^[0-9]+.[0-9]*/表示$1与“/ /”里面的正则表达式进行匹配,若匹配,则total加上$1,且len自增,即数目加1.“^[0-9]+.[0-9]*”是个正则表达式,“^[0-9]”表示以数字开头,“.”是转义的意思,表示“.”为小数点的意思。“[0-9]*”表示0个或多个数字)

    awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}'

    awk 'END{ for(i=1;i<NR;i++) {print i}}' file1

  • 相关阅读:
    BZOJ1511: [POI2006]OKR-Periods of Words
    BZOJ1009: [HNOI2008]GT考试
    BZOJ1355: [Baltic2009]Radio Transmission
    BZOJ1415: [Noi2005]聪聪和可可
    BZOJ1004: [HNOI2008]Cards
    UVA11077 Find the Permutations
    LA3641 Leonardo's Notebook
    UVA10294 Arif in Dhaka
    UVA11762 Race to 1
    UVA11427 Expect the Expected
  • 原文地址:https://www.cnblogs.com/eecs/p/4425690.html
Copyright © 2020-2023  润新知