文件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
如果 file1 的第 4 列与 file2 的第 4 列 (A==>> T,A,G,C) 中的任何字符匹配,则 file2 中的行应按照上面给出的输出和 file1 中的匹配字符打印 (这里来自第 1 行 column5) 的 T 应由 ""(T) 表示,来自 file1 的非匹配字符应由 "!"表示(C!)。
awk 'NR==FNR{firstfile[$1,$2,$4];next} ($1,$2,$4) in firstfile' File1 file2
我使用过 awk,但仅用于 (1,2,4) 列。请帮助进行第 5 次匹配。 第 5 列逗号分隔的字符在 file1 和 file2 中可能有不同的顺序。
最佳答案
您可以使用这个 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
关于awk - 我想将 file1 列(1,2,4,5)映射到 file2 列(1,2,4,5)。第 5 列可能包含不同顺序的逗号分隔字符 (A,T,G,C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68601981/