1. 打印
# 打印文件第一列和第三列
awk '{print $1, $3}' filename.txt
# 使用逗号作为字段分隔符,awk 默认使用空格作为字段分隔符。字段变量从 $1 开始,$0 表示整行内容。
awk -F, '{print $1, $2}' filename.txt
# 打印包含特定模式的行
awk '/pattern/ {print}' filename.txt
# 打印每一行的行号和内容
awk '{print NR, $0}' filename.txt
# 打印每行的最后一个字段
awk '{print $NF}' filename.txt
# 打印每行的字段数量
awk '{print NF}' filename.txt
# 打印最后一行
awk 'END {print}' filename.txt
2. 计算
# 计算文件中字段的总和
awk '{sum += $1} END {print sum}' filename.txt
# 对第一列的值进行数学运算
awk '{print $1^2}' filename.txt
3. 数据转换和格式化
# 将数据格式化为 CSV
awk '{print $1 "," $2 "," $3}' filename.txt
# FS=",": 设置字段分隔符为逗号(,),这是 CSV 文件的标准字段分隔符。
# OFS=";": 设置输出字段分隔符为分号(;)。
awk 'BEGIN {FS=","; OFS=";"} {print $1, $2, $NF} END {print "Done"}' filename.csv
4. 条件判断
# 只打印第一列大于某个值的行:
awk '$1 > 10 {print}' filename.txt
# 使用循环来迭代数组或执行复杂的逻辑,这里max为最大行的字段数
awk '{for (i=1; i<=NF; i++) if ($i > max) max = $i} END {print max}' filename.txt
# 字段数量过滤:
# 这个命令只会打印字段数超过 3 的行。
awk 'NF > 3' filename.txt
# 高级判断
awk '{if ($1 > 10) print "Greater than 10"; else if ($1 == 10) print "Equal to 10"; else print "Less than 10"}' filename.txt
5. 文本处理
# 在处理文件之前和之后执行操作
awk 'BEGIN {print "Start"} {print} END {print "End"}' filename.txt
# 批量处理文件
# FNR==1第一行
awk 'FNR==1 {print "Processing file " FILENAME} {print}' file1.txt file2.txt
6. 自定义函数
awk 'function sum(a, b) {return a + b} {print sum($1, $2)}' filename.txt
7. 内置函数
- 字符串函数
length(string):返回字符串的长度。
substr(string, start [, length]):返回字符串的一个子串,从 start 位置开始,可选的 length 参数指定子串长度。
index(string, search):返回 search 在 string 中的位置(从 1 开始);如果未找到,则返回 0。
match(string, regex):在 string 中搜索 regex 模式的匹配项,返回匹配的起始位置。
gsub(regex, replacement, string):在 string 中全局替换 regex 匹配的所有部分为 replacement。
sub(regex, replacement, string):替换 string 中第一个匹配 regex 的部分为 replacement。
split(string, array [, fieldsep]):使用 fieldsep 将 string 分割为字段,并存储在 array 中。
toupper(string):将字符串转换为大写。
tolower(string):将字符串转换为小写。 - 数学函数
int(number):返回数字的整数部分。
sin(number):计算正弦。
cos(number):计算余弦。
exp(number):计算 e 的指数。
log(number):计算自然对数。
sqrt(number):计算平方根。
rand():生成一个 0 到 1 之间的伪随机数。 - 时间函数(gawk 扩展)
systime():返回当前时间的时间戳。
strftime(format [, timestamp]):将时间戳转换为格式化的字符串。
mktime(“YYYY MM DD HH MM SS”):将日期时间字符串转换为时间戳。 - 数组函数
asort(arr [, d [, how]]):对数组 arr 进行排序,返回排序后的元素数。
asorti(arr, d [, how]):对数组 arr 的索引进行排序,将结果存储在 d 中。
8. 复杂处理
- 多维数组
awk '{arr[$1][$2] += $3} END {for (i in arr) for (j in arr[i]) print i, j, arr[i][j]}' filename.txt
- {arr[$1][$2] += $3}: 这部分是 awk 的主体动作。对于输入文件的每一行,它将第一列 ($1) 和第二列 ($2) 的值作为多维数组 arr 的索引,并将第三列 ($3) 的值累加到这个数组元素中。这意味着,该命令会对所有具有相同第一列和第二列值的行的第三列值进行求和。
- END {…}: END 是一个特殊的模式,表示在处理完所有输入行之后执行的动作。
- for (i in arr) for (j in arr[i]) print i, j, arr[i][j]: 在所有行被处理完毕后,这部分代码遍历数组 arr 并打印每个元素的索引和累加值。它首先遍历外层数组 i,然后遍历内层数组 j,并打印索引 i、j 和相应的累加值 arr[i][j]。
示例:
A B 10
A C 20
A B 30
B A 40
这条 awk 命令将执行以下操作:
- 对于第一行 A B 10,arr[‘A’][‘B’] 增加 10。
- 对于第二行 A C 20,arr[‘A’][‘C’] 增加 20。
- 对于第三行 A B 30,arr[‘A’][‘B’] 再增加 30(现在是 40)。
- 对于第四行 B A 40,arr[‘B’][‘A’] 增加 40。
在处理完所有行之后,awk 打印出:
A B 40
A C 20
B A 40