我想在Linux中屏蔽文件中的位,如下所示:

 actual : 00-00000000-00000011-00110010-10000000
 expect : 00-00000000-00000001-01101010-00000000
 error  : 00-00000000-00000010-01011000-00000000

在输出中,actual部分应该保持原样,除非error1,那么actual位应该用X进行掩码

如图所示,erroractualexpected数据的XOR.

输出应如下所示:

output : 00-00000000-000000X1-0X1XX010-10000000

有没有使用SED、AWK等命令来实现这一点的方法?

What is done so far:

grep 'err' gpbat | sed 's?-??g' | cut -c 11-35 | sed 's?1?X?g' > a1
grep 'act' gpbat | sed 's?-??g' | cut -c 11- > a2

但从这里开始,我不知道如何合并a1a2

推荐答案

使用多种版本的Awk:

awk '
    /actual/ { split($3,a,"") }
    /error/ { split($3,e,"") }

    END {
        for (i in a)
            c[i] = e[i]==1 ? "X" : a[i]

        for (i = length(c); i>0; --i)
            s = c[i] s

        printf "output : %s\n", s
    }
' gpbat

POSIX指出,空字符串的split的结果是未定义的行为"to allow a proposed future extension that would split up a string into an array of individual characters",但我个人还没有遇到过没有这样做的版本.YMMV.对于完全的可移植性,@markp-fuso的方法使用substr将是首选.


或稍微更高效(per@markp-fuso):

awk '
    /actual/ { n = split($3,a,"") }
    /error/ { split($3,e,"") }

    END {
        for (i = 1; i<=n; ++i)
            o = (o) ( e[i]==1 ? "X" : a[i] )
        print "output :", o
    }
' gpbat

并且,如果输入的顺序得到保证,则处理可以在读取"错误"行之后停止,因此这END个动作可以与exit一起移动到/error/个动作中,以避免不得不读取文件的其余部分:

awk '
    /actual/ { n = split($3,a,"") }
    /error/ {
        split($3,e,"")
        for (i = 1; i<=n; ++i)
            o = (o) ( e[i]==1 ? "X" : a[i] )
        print "output :", o
        exit
    }
' gpbat

Linux相关问答推荐

如何确定Linux上的最大静态TLS(线程本地存储)块大小?

为什么硬编码的阿拉伯字母与Unicode代码点不具有相同的值

Linux-如何区分目录中名称相同但扩展名不同的所有文件

如何让xargs对 bash 脚本中find命令找到的所有文件执行?

如何使用 sed 和 date 命令替换和格式化字符串中的日期?

重新运行时避免 Linux bash 脚本中的文件重命名重复

使用 bash 命令将文件从子文件夹复制到另一个

使用 sed 从文本文件中删除特定字符串

在 SLURM 作业(job)脚本中设置和传递字符串变量

从 Linux 到 Windows 交叉编译 C++ 应用程序的手册?

KDE 桌面效果中的 OpenGL 和 XRender 有什么区别?

无法覆盖符号链接 RedHat Linux

将以前忽略的目录添加到 Git 存储库

在 VIM 中搜索和替换导致尾随字符

execv() 和 fork() 的时间浪费

如何让 GNU 屏幕读取 .bash_profile/.bash_rc 更改?

发出信号并中断比较

用于 ssh 的类似 teamviewer 的工具?

在 Linux / Mono 上运行 ServiceStack 的最佳方式是什么?

Linux 中合理数量的 inotify 监视是多少?