Awk 是否有Linux命令用于列之间的字符串减法?
我正在把一些SNP列处理成vcf格式 输入列如下所示: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
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