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

Linux Shell下查找大矩阵中含'0'的列号的高效方法

查找矩阵中含'0'的列号的简便方法

针对你10000×10000的矩阵文件,不需要先转置再处理,用awk就能直接高效解决,分两种场景给你具体命令:

场景1:矩阵元素用分隔符分隔(比如空格、逗号)

如果你的test.txt里每行是用空格/逗号等分隔的元素(比如1 2 0 4这样),用下面的命令:

awk '{
    # 遍历当前行的每一列
    for (i=1; i<=NF; i++) {
        # 如果当前列是'0',标记该列号
        if ($i == "0") cols[i] = 1
    }
} END {
    # 遍历所有标记过的列号,按数字排序后输出
    for (c in cols) print c
}' test.txt | sort -n
  • NF是awk内置变量,代表当前行的列数
  • 数组cols用来记录存在'0'的列号,只存需要的列,内存占用极低,适合大矩阵
  • 最后用sort -n保证列号按从小到大输出

如果是逗号分隔,只要给awk加-F','参数就行:

awk -F',' '{...}' test.txt | sort -n

场景2:矩阵是连续字符(每行10000个字符,比如123056...)

如果每行是连续的单个字符(每个字符对应一列),用这个命令:

awk '{
    len = length($0)
    # 遍历当前行的每个字符(即每一列)
    for (i=1; i<=len; i++) {
        # 取第i个字符判断是否为'0'
        if (substr($0, i, 1) == "0") cols[i] = 1
    }
} END {
    for (c in cols) print c
}' test.txt | sort -n
  • length($0)获取当前行的字符总数(即列数)
  • substr($0, i, 1)提取第i个位置的字符

为什么比转置更简便?

转置大矩阵需要把所有列的数据临时存储,内存占用极高,甚至可能导致卡顿;而上面的awk方法只记录有'0'的列号,处理速度快、资源消耗小,完全不需要转置步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:40:43