逐个字符比较两个相同大小的文件,生成同等大小的三分之一

逐个字符比较两个相同大小的文件,生成同等大小的三分之一

我有两个字符串列表,长度都相等。

例子:

String A1: ATTCAGAATG
String A2: TGCCAGATAC

String B1: 0010011010
String B2: 0111010100

我想逐个字符地比较 A1 与 B1、A2 与 B2 等,如果 B 字符串中的同一位置有 1,则修改 A 字符串中的字符。如果 B 字符串中的字符是 0,我想不管它。

比较 A1 和 B1 的结果应该是ATxCAxxAxG,我想将其存储在第三个文件中。

有两个大小和长度相同的文本文件,每个文件在一行上包含一个序列。当该过程完成时,应该有第三个具有相同大小和长度的文件,这是两个文件的合并。

这是一项一次性工作,所以我愿意只使用 bash 或其他东西来做一些 hacky 的事情,尽管如果其他脚本或简单的 c 程序是处理这种情况的更明智的方式,我也愿意这样做。

您对处理此问题的最简单方法有何建议?

答案1

paste file1 file2 |\
awk '{
    len=length($1)
    for(char=1; char<=len; char++)
        printf (substr($0, char+len+1, 1)+0)? "x" : substr($0, char, 1)
    print ""
}'

答案2

这个答案另一个问题

paste <(od -An -vtu1 -w1 fileA) <(od -An -vtu1 -w1 fileB) \
| awk 'NF!=2{exit}; {printf "%c", $2==49?120:$1}'

49是ASCII的十进制值1,120是ASCII的十进制值x

要求如链接答案中所示:

您需要一个支持进程替换的 shell(如 GNU shell)、一个od支持-w选项的 shell(如 GNU shell od)、[...]

两个文件必须逐字节完美对齐。一般来说,“逐字节”并不等于您请求的“逐字符”,但对于包含ACGT01换行符的文件没有区别。

相关内容