• linux系统中awk命令


    1、测试数据

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098

    2、awk命令显示特定列

    [root@PC3 test]# awk '{print $1}' a.txt  ## 显示第一列
    34
    98
    23
    45
    10
    77
    87
    53
    46
    [root@PC3 test]# awk '{print $1,$3}' a.txt  ## 显示第一列和第三列
    34 78
    98 345
    23 668
    45 23
    10 35
    77 35
    87 45
    53 2334
    46 098
    [root@PC3 test]# awk '{print $0}' a.txt  ## 显示所有列
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098

    2、awk命令删除列

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '{$2="";print $0}' a.txt ## 删除第二列
    34  78
    98  345
    23  668
    45  23
    10  35
    77  35
    87  45
    53  2334
    46  098
    [root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt  ## 删除第一列和第三列
      78
      345
      668
      23
      35
      35
      45
      2334
      098

    awk删除列不能够删除空格!将多个空格或者制表符转换为一个空格的方法:

    [root@PC3 test]# awk '{$2="";print $0}' a.txt
    34  78
    98  345
    23  668
    45  23
    10  35
    77  35
    87  45
    53  2334
    46  098
    [root@PC3 test]# awk '{$2="";print $0}' a.txt | sed 's/[\t ]\+/ /'  ## 将多个空格或者制表符转换为一个空格
    34 78
    98 345
    23 668
    45 23
    10 35
    77 35
    87 45
    53 2334
    46 098
    [root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt
      78
      345
      668
      23
      35
      35
      45
      2334
      098
    [root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt | sed 's/^[\t ]*//g'  ## 删除行首空格
    78
    345
    668
    23
    35
    35
    45
    2334
    098

    3、awk命令指定读取分割符

    [root@PC3 test]# cat a.txt
    34_rtd_78
    98_fgg_345
    23_fgg_668
    45_dfs_23
    10_fsd_35
    77_jla_35
    87_saf_45
    53_sfg_2334
    46_wrt_098
    [root@PC3 test]# awk '{print $1}' a.txt   ## awk的复制分割符为空格或者制表符,因此输出了所有的内容
    34_rtd_78
    98_fgg_345
    23_fgg_668
    45_dfs_23
    10_fsd_35
    77_jla_35
    87_saf_45
    53_sfg_2334
    46_wrt_098
    [root@PC3 test]# awk -F "_" '{print $1}' a.txt  ## 指定输入分割符为_.
    34
    98
    23
    45
    10
    77
    87
    53
    46
    [root@PC3 test]# awk -F "_" '{print $1,$2}' a.txt
    34 rtd
    98 fgg
    23 fgg
    45 dfs
    10 fsd
    77 jla
    87 saf
    53 sfg
    46 wrt
    [root@PC3 test]# awk 'BEGIN{FS="_"}{print $1}' a.txt   ## 利用FS指定分割符
    34
    98
    23
    45
    10
    77
    87
    53
    46
    [root@PC3 test]# awk 'BEGIN{FS="_"}{print $1,$2}' a.txt
    34 rtd
    98 fgg
    23 fgg
    45 dfs
    10 fsd
    77 jla
    87 saf
    53 sfg
    46 wrt

    4、awk指定输出分割符

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '{print $1,$3}' a.txt
    34 78
    98 345
    23 668
    45 23
    10 35
    77 35
    87 45
    53 2334
    46 098
    [root@PC3 test]# awk '{OFS="!"}{print $1,$3}' a.txt  ## 指定输出分隔符为!
    34!78
    98!345
    23!668
    45!23
    10!35
    77!35
    87!45
    53!2334
    46!098

    同时指定多个分隔符:

    [root@PC3 test]# cat b.txt  ## 测试数据
    3_d_5_k
    a 2 8 f
    4:8:2:d
    [root@PC3 test]# awk '{print $1,$3}' b.txt  ## awk的默认读取分隔符为空格或者制表符
    3_d_5_k
    a 8
    4:8:2:d
    [root@PC3 test]# awk -F "[_ ]" '{print $1,$3}' b.txt ## 指定分隔符为_或者空格
    3 5
    a 8
    4:8:2:d
    [root@PC3 test]# awk -F "[_ :]" '{print $1,$3}' b.txt ## 指定分割符为_或者空格或者:.
    3 5
    a 8
    4 2

    5、awk命令打印行数

    [root@PC3 test]# awk '{print NR,$0}' a.txt
    1 34 rtd 78
    2 98 fgg 345
    3 23 fgg 668
    4 45 dfs 23
    5 10 fsd 35
    6 77 jla 35
    7 87 saf 45
    8 53 sfg 2334
    9 46 wrt 098

    6、awk打印列数

    [root@PC3 test]# awk '{print NF}' a.txt
    3
    3
    3
    3
    3
    3
    3
    3
    3

    7、awk打印匹配行

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '$1 ~ /45/{print $0}' a.txt  ## 打印第一列匹配45的行
    45 dfs 23
    [root@PC3 test]# awk '$2 ~ /fgg/{print $0}' a.txt  ## 打印第二列匹配fgg的行
    98 fgg 345
    23 fgg 668
    [root@PC3 test]# awk '$2 ~ /fgg/ && $3 ~ /345/{print $0}' a.txt  ## 打印第二列匹配fgg,同时第三列匹配345的行
    98 fgg 345

    8、awk依据数值大小过滤行

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '$1 > 50 {print $0}' a.txt   ## 过滤第一列大于50的行
    98 fgg 345
    77 jla 35
    87 saf 45
    53 sfg 2334
    [root@PC3 test]# awk '$1 > 50 && $2 ~ /fgg/ {print $0}' a.txt  ## 同时满足两个条件
    98 fgg 345

    而且与或者

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '$1 >= 30 && $1 <= 80 {print $0}' a.txt  ## 大于30而且小于80
    34 rtd 78
    45 dfs 23
    77 jla 35
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '$1 <= 30 || $1 >= 80 {print $0}' a.txt  ## 小于30 或者 大于80
    98 fgg 345
    23 fgg 668
    10 fsd 35
    87 saf 45

    9、awk  if条件分支

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '{if($1 > 20){print $0}}' a.txt  ## 根据第一列进行判断
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '{if($1 > 20){print $0} else {print $1}}' a.txt  
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '{if($1 > 80){print $0} else if($1 > 50) {print $1,$2} else {print $1}}' a.txt
    34
    98 fgg 345
    23
    45
    10
    77 jla
    87 saf 45
    53 sfg
    46

    10、awk输出奇数行、偶数行和整倍数行

    [root@PC3 test]# cat a.txt
    1 34 rtd 78
    2 98 fgg 345
    3 23 fgg 668
    4 45 dfs 23
    5 10 fsd 35
    6 77 jla 35
    7 87 saf 45
    8 53 sfg 2334
    9 46 wrt 098
    [root@PC3 test]# awk '{if(NR%2 == 0){print $0}}' a.txt  ## 取偶数行
    2 98 fgg 345
    4 45 dfs 23
    6 77 jla 35
    8 53 sfg 2334
    [root@PC3 test]# awk '{if(NR%2 != 0){print $0}}' a.txt   ## 取奇数行
    1 34 rtd 78
    3 23 fgg 668
    5 10 fsd 35
    7 87 saf 45
    9 46 wrt 098
    [root@PC3 test]# awk '{if(NR%3 == 0){print $0}}' a.txt  ## 取3倍整数行
    3 23 fgg 668
    6 77 jla 35
    9 46 wrt 098

    11、awk 列之间的四则运算

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '{print $1 + $3}' a.txt  ## 求和
    112
    443
    691
    68
    45
    112
    132
    2387
    144
    [root@PC3 test]# awk '{print $1 - $3}' a.txt  ## 差
    -44
    -247
    -645
    22
    -25
    42
    42
    -2281
    -52
    [root@PC3 test]# awk '{print $1 * $3}' a.txt  ## 积
    2652
    33810
    15364
    1035
    350
    2695
    3915
    123702
    4508
    [root@PC3 test]# awk '{print $1 / $3}' a.txt  ## 商
    0.435897
    0.284058
    0.0344311
    1.95652
    0.285714
    2.2
    1.93333
    0.0227078
    0.469388
    [root@PC3 test]# awk '{print $1 % $3}' a.txt  ##余数
    34
    98
    23
    22
    10
    7
    42
    53
    46

    12、awk求列的和以及平均数

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk '{sum += $1}END{print sum}' a.txt  ## 求第一列的和
    473
    [root@PC3 test]# awk '{sum += $1}END{print sum/NR}' a.txt  ## 求第一列的平均数
    52.5556

    13、awk 引入变量值

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# a=2
    [root@PC3 test]# awk -v b=$a '{print $b}' a.txt
    rtd
    fgg
    fgg
    dfs
    fsd
    jla
    saf
    sfg
    wrt

    14、awk 统计特定字符在一行中出现的次数

    [root@PC3 test]# cat a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098
    [root@PC3 test]# awk -F "3" '{print NF-1}' a.txt  ## 统计3在每一行中出现的次数
    1
    1
    1
    1
    1
    1
    0
    3
    0

    15、awk命令删除空行

    [root@PC3 test]# cat -A a.txt
    34 rtd 78$
    98 fgg 345$
    23 fgg 668$
    $
    45 dfs 23$
    10 fsd 35$
    77 jla 35$
    87 saf 45$
    53 sfg 2334$
    46 wrt 098$
    [root@PC3 test]# awk NF a.txt
    34 rtd 78
    98 fgg 345
    23 fgg 668
    45 dfs 23
    10 fsd 35
    77 jla 35
    87 saf 45
    53 sfg 2334
    46 wrt 098

    16 、awk命令忽略大小写

    [root@PC3 test]# cat a.txt
    3 a d
    9 k a
    2 h A
    c 3 k
    1 z c
    3 A 5
    [root@PC3 test]# awk '/a/' a.txt
    3 a d
    9 k a
    [root@PC3 test]# awk '/A/' a.txt
    2 h A
    3 A 5
    [root@PC3 test]# awk 'BEGIN{IGNORECASE=1} /a/' a.txt
    3 a d
    9 k a
    2 h A
    3 A 5

    17、awk 命令大小写转换

    [root@PC3 test]# cat a.txt
    3 a d
    9 k a
    2 h A
    c 3 k
    1 z c
    3 A 5
    [root@PC3 test]# awk '{print toupper($0)}' a.txt
    3 A D
    9 K A
    2 H A
    C 3 K
    1 Z C
    3 A 5
    [root@PC3 test]# awk '{print tolower($0)}' a.txt
    3 a d
    9 k a
    2 h a
    c 3 k
    1 z c
    3 a 5
    [root@PC3 test]# awk '{print toupper($2)}' a.txt
    A
    K
    H
    3
    Z
    A

    18、awk命令计算某一类文件总的大小

    [root@PC3 sheep]# ls
    a.ped  result.map  result.ped  tr.map
    [root@PC3 sheep]# ls -lh
    total 1.1G
    -rw-r--r--. 1 root root 204M Jan 30 11:33 a.ped
    -rw-r--r--. 1 root root  20M Jan 14 11:33 result.map
    -rw-r--r--. 1 root root 829M Jan 14 11:33 result.ped
    -rw-r--r--. 1 root root 7.4M Jan 30 11:33 tr.map
    [root@PC3 sheep]# ls -l *.map | awk '{sum +=$5}END{print sum/(1024*1024),"Mb"}'
    26.9319 Mb

    19、awk命令依据行的长度进行筛选

    [root@PC3 test]# cat a.txt
    3
    9k
    2hA
    cfsd
    1zc3d
    3A5sdf
    asfdfds
    safssdff
    sfafsfsfa
    asfdfdfsee
    [root@PC3 test]# awk 'length == 3' a.txt
    2hA
    [root@PC3 test]# awk 'length == 6' a.txt
    3A5sdf
    [root@PC3 test]# awk 'length > 6' a.txt
    asfdfds
    safssdff
    sfafsfsfa
    asfdfdfsee
    [root@PC3 test]# awk 'length < 4' a.txt
    3
    9k
    2hA
    [root@PC3 test]# awk 'length > 2 && length < 6' a.txt
    2hA
    cfsd
    1zc3d
  • 相关阅读:
    四则运算
    实验四 决策树算法及应用
    实验三 朴素贝叶斯算法及应用
    实验二 K-近邻算法及应用
    实验三 面向对象分析与设计
    实验二 结构化分析与设计
    实验一 软件开发文档与工具的安装与使用
    ATM管理系统
    流程图与活动图的区别与联系
    四则运算自动生成程序
  • 原文地址:https://www.cnblogs.com/liujiaxin2018/p/14347437.html
Copyright © 2020-2023  润新知