gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:43:51 24 4
gpt4 key购买 nike

文件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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com