我想将file1列(1,2,4,5)映射到file2列(1,2,4,5)。第5列可能包含不同顺序的逗号分隔字符(A,T,G,C)

文件 1

chr1 123896 rs0987522 A T
chr5 678452 rs8733521 G C,A

文件 2

chr1 123896 rs0987522 A T,C,G
chr5 678452 rs8733521 G A,T

输出

chr1 123896 rs0987522 A T*,C,G
chr5 678452 rs8733521 G C!,A*,T

如果文件 1 的第 4 列与文件 2 的第 4 列(A==>> T、A、G、C)中的任何字符匹配,则文件 2 中的行应按上面给出的输出和文件 1 中的匹配字符进行打印(此处为 T 来自第一行 column5) 应由“ ” (T ) 表示,文件 1 中的非匹配字符应由“!”表示 (C!)。

awk 'NR==FNR{firstfile[$1,$2,$4];next} ($1,$2,$4) in firstfile' File1 file2

我使用过 awk,但仅用于 (1,2,4) 列。请帮助进行第 5 次匹配。第 5 列逗号分隔的字符在文件 1 和文件 2 中的顺序可能不同。

回答

您可以使用awk$5密钥存储为($1,$2,$4). 在处理 file2 时,它用逗号分割存储的值,并通过附加*. 如果未找到元素(即sub返回0),则我们通过添加!,

awk 'NR==FNR {
   map[$1,$2,$4] = $5
   next
}
($1,$2,$4) in map {
    n = split(map[$1,$2,$4], a, /,/)
    for (i=1; i<=n; ++i)
       if (sub(a[i], "&*", $5) == 0)
          $5 = a[i] "!," $5
} 1' file1 file2

chr1 123896 rs0987522 A T*,C,G
chr5 678452 rs8733521 G C!,A*,T


以上是我想将file1列(1,2,4,5)映射到file2列(1,2,4,5)。第5列可能包含不同顺序的逗号分隔字符(A,T,G,C)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>