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
进行授权