【问题标题】:Is there a Linux command for string subtraction between columns? [closed]是否有用于列之间字符串减法的 Linux 命令? [关闭]
【发布时间】:2019-07-08 10:17:48
【问题描述】:

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

【问题讨论】:

  • 您能解释一下从给定输入中获得预期输出的逻辑需要吗?另外,不要假设每个人都知道什么是 SNP 或 vcf。如果这与生物信息学有关,bioinformatics.stackexchange.com 可能更适合您。并且希望您展示自己为解决此问题所做的工作。

标签: awk uniq vcf-variant-call-format


【解决方案1】:

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

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

【讨论】:

  • 我想在管道中使用它,所以我将 awk 文件转换为一行:cat inputf.file | awk 'NR == 1 {打印;下一个} {printf "%s", $1; sep = "\t"; for (i = 2; i
【解决方案2】:
$ 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 中任何字符串的子字符串时,上述方法才有效。

【讨论】:

  • 我试过这个命令行,输出正是我需要的,谢谢!
【解决方案3】:

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

【讨论】:

  • 亲爱的肖恩,我对 Perl 了解不多,无论如何这条线对我来说很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2012-02-15
  • 2021-11-30
相关资源
最近更新 更多