文件 1
chr1 123896 rs0987522 A T
chr5 678452 rs8733521 G C,A
Run Code Online (Sandbox Code Playgroud)
文件 2
chr1 123896 rs0987522 A T,C,G
chr5 678452 rs8733521 G A,T
Run Code Online (Sandbox Code Playgroud)
输出
chr1 123896 rs0987522 A T*,C,G
chr5 678452 rs8733521 G C!,A*,T
Run Code Online (Sandbox Code Playgroud)
如果文件 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
Run Code Online (Sandbox Code Playgroud)
我使用过 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
Run Code Online (Sandbox Code Playgroud)