我有一个矩阵(大约10,000 x 10,000),我想找出包含‘0’的列号.

Matrix(test.txt):

1 1 1 1 1 1 1 1 1 1
1 0 1 1 1 0 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
3 2 2 3 3 0 3 2 2 2
3 2 1 3 3 0 3 2 2 0
3 2 2 3 3 2 3 2 2 2
1 1 1 1 1 1 1 1 1 1

帖子主题:Re:Колибри

2 4 6 10

我是第一次接触Linuxshell ,在类似的例子中没有找到太多.任何帮助都将不胜感激!!

我只知道如何用代码grep -nw '0' test.txt|cut -f1 -d':'找到行号,也许我可以先转置矩阵(like this)?然后使用上面的代码,对吗?有没有更简单的办法呢?

推荐答案

在每个Unix机器上的任何shell 中使用任何awk:

$ awk '
    /(^| )0( |$)/ {
        for ( i=1; i<=NF; i++ ) {
            if ( $i == 0 ) {
                cols[i]
            }
        }
    }
    END {
        for ( i in cols ) {
            printf "%s%d", sep, i
            sep = OFS
        }
        print ""
    }
' file
2 4 6 10

由于使用in运算符的循环,上面的输出不能保证是数字(或任何其他)顺序,有关详细信息,请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array.

如果您需要以递增的数字顺序打印字段号,则将脚本更改为非常缓慢的:

awk '
    /(^| )0( |$)/ {
        for ( i=1; i<=NF; i++ ) {
            if ( $i == 0 ) {
                cols[i]
            }
        }
    }
    END {
        for ( i=1; i<=NF; i++ ) {
            if ( i in cols ) {
                printf "%s%d", sep, i
                sep = OFS
            }
        }
        print ""
    }
' file

Linux相关问答推荐

使用sed或awk映射自定义和任意函数

我想显示包含一个方括号的行,方括号可以是开括号,也可以是闭括号.

为什么waitpid(2)可以指定非子进程?

在具有不同文件类型的文件夹中编辑多个 xml 文件 - 使用预定顺序

如何计算文本的时差,如 YYYYMMDDHHMMSSXXX 格式,包括毫秒

我可以防止 gcc 优化器延迟内存分配吗?

Bash 更新 yaml 文件中的图像值

使用 Dockerfile RUN 执行某些操作但忽略错误

我应该如何从非 root Debian Linux 守护进程登录?

sig_atomic_t 实际上是如何工作的?

在 Python 上模拟鼠标点击

关于 putenv() 和 setenv() 的问题

在 64 位 Linux 操作系统上编译 32 位程序导致致命错误

使用正则表达式时,Shell 'tar: not found in archive' 错误

在 cron 作业(job)中执行 PHP 脚本

-zxvf 在 tar -zxvf <文件名> 中是什么意思?

如何将整个文件夹从 Amazon EC2 Linux 实例复制到本地 Linux 机器?

如何让 PHP、Symlinks 和 __FILE__ 很好地协同工作?

将 AWK 结果分配给变量

如何使用文件描述符刷新写入?