shell 输出特定字符的所有列号

w8biq8rn  于 2022-12-23  发布在  Shell
关注(0)|答案(3)|浏览(189)

我有一个矩阵(大约10,000x10,000),我想找到包含"0"的列号。
矩阵(test.txt):
输出(示例):

2 4 6 10

我是linux shell的新手,在类似的例子中没有发现太多。任何帮助都将非常感谢!!
我只知道如何使用代码查找行号:grep -nw '0' test.txt|cut -f1 -d':',也许我可以先转置矩阵(like this)?然后使用上面的代码,对吗?有没有更简单的方法?

btxsgosb

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
iovurdzv

iovurdzv2#

为什么不使用矩阵语言进行矩阵运算,例如GNU Octave:

<infile octave --silent --eval "
[row, col] = find( dlmread(0) == 0 );
dlmwrite(1, unique(col))"

输出:

2
4
6
10

为dlm * 命令指定的0和1分别表示标准输入和标准输出。
如果希望输出在一行中,请调换位置并指定分隔符,例如将dlmwrite(...)更改为dlmwrite(1, unique(col)', ' ')"

0qx6xfy6

0qx6xfy63#

也许我可以转置矩阵
是的,只需使用可以执行此操作的工具,例如GNU datamash,如下所示,让file.txt内容为
那么

datamash --field-separator=' ' transpose < file.txt

给出输出
说明:我通知GNU datamash该文件是空格分隔的,并指示它转置。免责声明:该解决方案假设每行具有完全相等数量的场。

  • (在GNU数据闪存1.7中测试)*

相关问题