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

rij*_*rij 3 awk grep

文件 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 中的顺序可能不同。

anu*_*ava 5

您可以使用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)