-1

我正在将一些 SNP 列处理成 vcf 格式。

输入列如下:

ref     ALT 
A       A G 
A       A T 
T       C T 
G       G T 
A       A G 
C       C G T 
G       A G 
T       C T 
T       A G T

预期输出:

ref     ALT
A       G
A       T
T       C
G       T
A       G
C       G,T
G       A
T       C
T       A,G
4

3 回答 3

3

这在这里并不优雅,只是遍历每一行上的字段并在与第一列比较后决定是否打印。

NR == 1 {print; next}
{
    printf "%s", $1
    sep = "\t"
    for (i = 2; i <= NF; ++i) {
        if ($i != $1) {
            printf "%s%s", sep, $i
            sep = ","
        }
    }
    print ""
}

$ awk -f a.awk file
ref     ALT
A   G
A   T
T   C
G   T
A   G
C   G,T
G   A
T   C
T   A,G
于 2019-07-08T11:27:29.943 回答
1
$ awk 'BEGIN{FS=OFS="\t"} NR>1{sub($1," ",$2); gsub(/^ +| +$/,"",$2); gsub(/ +/,",",$2)} 1' file
ref     ALT
A       G
A       T
T       C
G       T
A       G
C       G,T
G       A
T       C
T       A,G

仅当 $1 不包含 RE 元字符并且不能是 $2 中任何字符串的子字符串时,上述内容才有效。

于 2019-07-08T13:02:40.843 回答
1

使用 perl 而不是 awk 可以实现简短的单行:

$ perl -lane 'print $F[0], "\t", join(",", grep { $_ ne $F[0] } @F)' input.txt
ref ALT
A   G
A   T
T   C
G   T
A   G
C   G,T
G   A
T   C
T   A,G
于 2019-07-08T15:08:26.760 回答