如何从表中提取行并将其放入单独的文件中?

如何从表中提取行并将其放入单独的文件中?

我有一个有 5 列和多行的表

最后一列包含每行所有值的总和

像那样:

A       B   C   D   E
gene1   1   3   5   9
gene2   0   0   4   4
gene3   1   0   1   2
gene4   5   5   0   10
gene5   2   0   0   2

我想做的是将gene2和gene5行提取到一个单独的文件中,并且还有另一个文件包含其他基因(但没有提取的基因)、gene1、gene3和gene4

我正在考虑使用该awk命令,但我不明白如何链接行和数字?

答案1

使用awk

awk '{
    if ( ($2 == $5 && $3 + $4 == 0) || ($3 == $5 && $2 + $4 == 0) || ($4 == $5 && $2 + $3 == 0) ) {
        print $0 > "match-file"
    } else if ($2 + $3 + $4 == $5) { 
        print $0 > "nomatch-file"
    }
}' input

答案2

一个(非常相似)的替代方案:

awk '{
    if ( $2 == $5 || $3 == $5|| $4 == $5 ) {
        print $0 > "match-file"
    } else if ($2 + $3 + $4 == $5) { 
        print $0 > "nomatch-file"
    }
}' input

答案3

Using GNU awk:

$ awk 'NR>1{
    t = gensub(/ /, "  ", "g")
    f = gsub(/ 0 /, "", t) > 1 ? "File1" : "File2"
    print $0 > f
}' file

使用所有 Posix sed 结构,我们可以执行以下操作:

$ sed -ne '
   1b
   s/[[:blank:]]0[[:blank:]]/&/2w File1
   t
   s/^//w File2
' file

在模式下运行 sed -n,这意味着不默认打印模式空间。跳过标题行,假定为第一行。

如果在标题以外的行中,我们能够看到至少两个孤立的零 => 最后一列必须与 2、3 或 4 列中的一列匹配。这是因为最后一列是第 2、3 和 4 列的总和。

假设没有前导或尾随空格。

结果转储到 File1 中以查找匹配的记录。其余的则为 File2。两个输出中均不存在标头。

答案4

似乎您只是在行中寻找 2 个(前导)零,在这种情况下尝试

awk '{if (NR==1){print > "match"; print > "nomatch"}
    else
    {if ($0 ~ / 0.* 0/) {print > "match"} else {print > "nomatch"}}}' file1

相关内容