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