是否有 Linux 命令用于列之间的字符串减法?

Is there a Linux command for string subtraction between columns?

我正在将一些 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

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

NR == 1 {print; next}
{
    printf "%s", 
    sep = "\t"
    for (i = 2; i <= NF; ++i) {
        if ($i != ) {
            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
$ awk 'BEGIN{FS=OFS="\t"} NR>1{sub(," ",); gsub(/^ +| +$/,"",); gsub(/ +/,",",)} 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 中任何字符串的子字符串时,以上内容才有效。

使用 perl 而不是 awk 允许短 one-liner:

$ 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