You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash统计每列中-1的出现次数?解决awk报错问题

解决方案:统计每列中-1的出现次数

先解决你的awk错误问题

你遇到的fatal: attempt to access field -1错误,是因为修改脚本时误把要匹配的-1写成了字段索引(比如$-1)——awk的字段索引只能是正整数,负数索引是非法的,所以触发了这个致命错误。

正确的awk脚本

下面是可以正确统计每列-1出现次数的awk代码:

BEGIN { OFS=" " }
{
    # 遍历当前行的所有字段
    for (i = 1; i <= NF; i++) {
        # 判断当前字段是否等于-1,是则对应列计数加1
        if ($i == -1) count[i]++
    }
}
END {
    # 遍历所有列,输出计数(未统计到的列默认补0)
    for (i = 1; i <= NF; i++) {
        printf "%d%s", count[i] + 0, (i == NF ? "\n" : OFS)
    }
}

使用方式:假设你的数据存在data.txt文件中,执行:

awk -f count_neg1.awk data.txt

或者直接一行命令:

awk 'BEGIN{OFS=" "}{for(i=1;i<=NF;i++){if($i==-1)count[i]++}}END{for(i=1;i<=NF;i++){printf "%d%s",count[i]+0,(i==NF?"\n":OFS)}}' data.txt

执行后会输出你期望的结果:0 0 2 1 3 0

纯Bash实现方案

如果不想用awk,也可以用Bash原生工具完成统计:

# 读取数据文件(替换成你的数据路径)
data_file="data.txt"

# 获取总列数
total_cols=$(head -n1 "$data_file" | wc -w)

# 初始化结果数组
results=()

# 遍历每一列统计-1的数量
for ((col=1; col<=total_cols; col++)); do
    # 提取第col列,精确匹配-1并统计行数
    neg1_count=$(cut -d' ' -f"$col" "$data_file" | grep -c '^-1$')
    results+=("$neg1_count")
done

# 输出最终结果
echo "${results[*]}"

说明

  • cut -d' ' -f"$col":按空格分隔提取第col列
  • grep -c '^-1$':精确匹配整行是-1的内容,-c参数统计匹配的行数
  • 最终结果数组用${results[*]}展开,输出为空格分隔的字符串

内容的提问来源于stack exchange,提问作者nrcombs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:56:18