脚本中Awk处理列数据有什么技巧

wen 实用脚本 5

本文目录导读:

脚本中Awk处理列数据有什么技巧

  1. 字段分隔符灵活设置
  2. 列重排与组合
  3. 空值处理技巧
  4. 数值计算与统计
  5. 字符串处理
  6. 条件过滤与格式化
  7. 多文件处理
  8. 复杂场景示例
  9. 实用小贴士:

在Awk脚本中处理列数据有很多实用技巧,这里帮你总结几个最常用的:

字段分隔符灵活设置

# 默认是空白字符(空格/Tab)
cat file.txt | awk '{print $1, $2}'
# 指定分隔符 - 逗号
awk -F',' '{print $1, $3}' data.csv
# 多个分隔符
awk -F'[:,]' '{print $1, $2}' file.txt
# 使用正则作为分隔符
awk -F'[[:space:]]+' '{print $NF}' file.txt  # 取最后一列

列重排与组合

# 交换前两列
awk '{print $2, $1, $3}'
# 拼接列
awk '{print $1 "_" $2, $3}'
# 特定条件筛选列
awk 'NR>1 && $3>100 {print $1, $3}' data.txt  # 跳过表头,筛选第3列>100的

空值处理技巧

# 用默认值替换空列
awk '{$2 = $2 ? $2 : "N/A"; print}' data.txt
# 跳过空行
awk 'NF>0' file.txt
# 检查某列是否为空
awk '$3=="" {print "第3列为空:", $0}'

数值计算与统计

# 列求和
awk '{sum+=$3} END {print "总和:", sum}'
# 多列统计
awk '{col1+=$1; col2+=$2; count++} 
     END {print "平均值:", col1/count, col2/count}'
# 百分比计算
awk '{total+=$2; arr[NR]=$2} 
     END {for(i in arr) printf "%s %.2f%%\n", $1, arr[i]/total*100}'

字符串处理

# 截取前几个字符
awk '{print substr($2, 1, 3)}'  # 截取第2列前3字符
# 查找替换
awk '{$1=gsub(/old/, "new", $1); print}'
# 分割字符串
awk '{split($1, arr, "-"); print arr[1], arr[2]}'

条件过滤与格式化

# 多条件筛选
awk '$3 > 50 && $4 ~ /error/ {print}'
# 格式化输出
awk '{printf "%-20s %8.2f %3d\n", $1, $2, $3}'
# 行号范围
awk 'NR>=10 && NR<=20 {print}'

多文件处理

# 合并多个文件
awk 'FNR==1 && NR!=1 {next} {print}' file1.csv file2.csv
# 按特定列关联
awk 'NR==FNR {a[$1]=$2; next} $1 in a {print $0, a[$1]}' file1 file2

复杂场景示例

# 删除重复行(基于某一列)
awk '!seen[$1]++' data.txt
# 分组聚合
awk '{count[$1]++; sum[$1]+=$2} 
     END {for(k in count) print k, count[k], sum[k]}'
# 条件判断时跳过空列
awk '$3 != "" {print $1, $2 * $3}'

实用小贴士:

  • NF变量:当前行字段数,$NF表示最后一列
  • NR变量:当前行号
  • FNR变量:当前文件的行号
  • OFS变量:输出字段分隔符,默认为空格
  • ORS变量:输出记录分隔符,默认为换行

快速调试技巧

# 查看列数和内容
awk '{print NR": "$0}' file.txt | head -5
# 打印所有列
awk '{for(i=1;i<=NF;i++) print NR".第"i"列:", $i}'

这些技巧组合使用,基本能应对90%的列处理场景,遇到具体需求,先用小样测试规则,再应用到全量数据。

抱歉,评论功能暂时关闭!