我有一个有 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