我有一个矩阵(大约10,000x10,000),我想找到包含"0"的列号。矩阵(test.txt):输出(示例):
2 4 6 10
我是linux shell的新手,在类似的例子中没有发现太多。任何帮助都将非常感谢!!我只知道如何使用代码查找行号:grep -nw '0' test.txt|cut -f1 -d':',也许我可以先转置矩阵(like this)?然后使用上面的代码,对吗?有没有更简单的方法?
grep -nw '0' test.txt|cut -f1 -d':'
btxsgosb1#
$ awk ' /(^| )0( |$)/ { for ( i=1; i<=NF; i++ ) { if ( ($i == 0) && !seen[i]++ ) { cols[++numCols] = i } } } END { for ( c=1; c<=numCols; c++ ) { printf "%s%s", cols[c], (c<numCols ? OFS : ORS) } } ' file 2 6 4 10
iovurdzv2#
为什么不使用矩阵语言进行矩阵运算,例如GNU Octave:
<infile octave --silent --eval " [row, col] = find( dlmread(0) == 0 ); dlmwrite(1, unique(col))"
输出:
为dlm * 命令指定的0和1分别表示标准输入和标准输出。如果希望输出在一行中,请调换位置并指定分隔符,例如将dlmwrite(...)更改为dlmwrite(1, unique(col)', ' ')"
dlmwrite(...)
dlmwrite(1, unique(col)', ' ')"
0qx6xfy63#
也许我可以转置矩阵是的,只需使用可以执行此操作的工具,例如GNU datamash,如下所示,让file.txt内容为那么
datamash
file.txt
datamash --field-separator=' ' transpose < file.txt
给出输出说明:我通知GNU datamash该文件是空格分隔的,并指示它转置。免责声明:该解决方案假设每行具有完全相等数量的场。
3条答案
按热度按时间btxsgosb1#
iovurdzv2#
为什么不使用矩阵语言进行矩阵运算,例如GNU Octave:
输出:
为dlm * 命令指定的0和1分别表示标准输入和标准输出。
如果希望输出在一行中,请调换位置并指定分隔符,例如将
dlmwrite(...)
更改为dlmwrite(1, unique(col)', ' ')"
0qx6xfy63#
也许我可以转置矩阵
是的,只需使用可以执行此操作的工具,例如GNU
datamash
,如下所示,让file.txt
内容为那么
给出输出
说明:我通知GNU
datamash
该文件是空格分隔的,并指示它转置。免责声明:该解决方案假设每行具有完全相等数量的场。