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

Awk 是否有Linux命令用于列之间的字符串减法?,awk,uniq,vcf-variant-call-format,Awk,Uniq,Vcf Variant Call Format,我正在把一些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

我正在把一些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", $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
NR==1{print;next}
{
printf“%s”,1美元
sep=“\t”
对于(i=2;i

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

使用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

你能解释一下从给定输入中获得预期输出所需的逻辑吗?另外,不要假设每个人都知道什么是SNP或vcf。如果这与生物信息学有关,可能更适合你。而且你需要展示你自己解决这个问题所做的工作。我已经尝试了这个命令行,输出正是我需要的,Thanks!我想在管道中使用它,所以我将awk文件转换为一行:cat inputf.file | awk'NR==1{print;next}{printf“%s”,$1;sep=“\t”;for(i=2;我亲爱的Shawn,我对Perl不太了解,不管怎样,这行代码对我来说很好。谢谢!
$ 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