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

标签 awk grep

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

相关文章:

bash - 提取括号之间的字符串

python - 如何按日期时间范围进行grep?

查找二元组的 Shell 脚本

regex - 使用ack或awk或比grep更好的方法从另一个文件中获取模式?

windows - 在 Windows 上编译 Apache APR

awk - 有人可以帮助我在其他列上使用 awk 获得列的平均值吗

macos - 对文件中的行中的单词进行排序并再次输出排序后的行

Linux:如何显示 UID 介于 300 和 500 之间的所有 Linux 用户?

shell - 为 IBMi IFS 上的目录中的每个文件递归搜索目录

regex - 如何在 Linux 上从 id 中提取 uid 值?