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

