文章

awk按列求和

Linux 下的 awk 功能十分强大,擅长按照字段列处理文本,另一个工具 sed 则擅长用于行处理。

有的时候需要按照过滤筛选之后文本的文本求和,一般的方法就是通过 bc 或者复制粘贴到 excel 中处理,也可以使用 awk 处理。

  • 指定分隔符 : -F|-IFS 选项用于指定分隔符,默认为空格,如果存在特殊字符记得使用单引号或者转义符
  • 内部变量 : awk 中存在部分内部变量,可以直接使用 $varname 使用,例如 $NF 表示最后一个字段列;$num 表示列的序号,例如 $1 表示第一列; NR 表示记录的所在的行号,可以使用 ‘{print NR}’ 打印所在的行号。
  • 自定义变量 : -v var=val, 如果在花括号 {} 中,可以直接使用变量名直接赋值
  • 自定义输出分隔符 : -OFS 选项可以自定义输出分隔符,默认为空格。有的时候需要将数据保存为 csv 格式,数据最初的分隔符不是逗号,可以通过 -OFS 修改数据的输出分隔符。

更多的使用方法可以使用 man awk 查看。

假设存在以下文本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# cat test.txt
H5,384.02508544921875
SYS,38.52734375
WIS,29.7301025390625
ORIS,16.79449462890625
HY_ODS,7.00579833984375
HY,4.9473876953125
NBUS,2.85882568359375
AUS,1.55413818359375
PH_WS,1.39202880859375
H20,1.3232421875
RER,1.25140380859375
FOTION,1.112060546875
PHHSS,1.08758544921875
PR,1.03509521484375
SPD,.9547119140625

  • 指定列求和
    1
    2
    3
    
    awk -F, '{sum+=$2}; END {print sum}' test.txt
    ##  END 前面也可以不适用分号,表示一个完整的处理流程
    awk -F, '{sum+=$2} END {print sum}' test.txt
    
  • 匹配字段之后在进行求和
    1
    2
    
    ## 表示匹配 HY 开头的行,仅对这些行的指定字段进行求和
    awk  -F,  '/HY/ {sum+=$2}; END {print sum}' test.txt
    
本文由作者按照 CC BY 4.0 进行授权

© TheDarkStarJack. 保留部分权利。

[本站总访问量次] [本站访客数人次] [本文总阅读量次]

本站采用 Jekyll 主题 Chirpy