是否存在用于在列之间进行字符串减法的Linux命令?

时间:2019-07-08 10:17:48

标签: awk uniq

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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中任何字符串的子字符串时,以上内容才有效。

答案 2 :(得分: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