如何用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
相关产品推荐
相关产品推荐

