有条件保留行

有条件保留行

这是我的文件的一部分(有 10000 行):

N N N N N N N N N N N
N N N N N N N N N N N
N N N N R N N N N N N
N N N N N N N N N N N
N N N N N N N N N N N
N N N N N N N N N N N
N N N N N N N N N N N
A N N N N N N N N N N
N N N N N N N N N N N
N N N N N N N N G N N

我想删除那些包含所有基因型的品系N,并仅保留那些至少具有 1 个非 N 基因型的品系。这是我想要的输出:

N N N N R N N N N N N
A N N N N N N N N N N
N N N N N N N N G N N

我怎样才能做到这一点?

答案1

您可以简单地使用带有 -v 选项的 revert grep 。它仅适用于您的示例中格式化的文本,但它可能足以满足您的需求。

$ grep -v "N N N N N N N N N N N" yourFile.txt

作为您对具有一种不同于 N 的基因型的品系的请求,您可以创建一个包含以下内容的脚本:

#!/bin/sh
while read i
do
        n=`echo $i | tr " " "\n" | uniq -c | grep "N" | awk '{print $1}'`
        if [ "$n" == "10" ]
        then
                echo $i
        fi
done < "$1"

然后授予您的脚本执行权:

$ chmod +x myScript.sh

然后运行它

$ ./myScript.sh myFile.txt

然后你可以在你的线路上修改你想要多少N

如果 [“$n”==“10”]

不是很优雅,但它可以完成工作并且不需要任何东西

答案2

sed -n '/[^N ]/p' input.txt

此命令检查该行是否包含除“N”或“ ”(空格)之外的内容。如果包含 - 则打印此行。

或者

sed '/[^N ]/!d' input.txt

相同的结果,但通过另一种方式 - 它删除仅包含“N”和“”(空格)的行。如果该行包含其他内容 - 则不删除它。

答案3

perl

$ perl -alne 'print if grep { $_ ne "N" } @F' file
N N N N R N N N N N N
A N N N N N N N N N N
N N N N N N N N G N N

在标量上下文中,grep如果字段数组中至少有一个元素@F不等于,则 的值为 true "N"

如果您想测试特定数量的非 N 条目,您可以轻松完成 - 例如,仅打印仅包含一个非 N 字段的行:

perl -alne 'print if (grep { $_ ne "N" } @F) == 1' file

答案4

使用awk。跳过空/空白(制表符+/空格)/仅 N 行并打印其余内容。

awk -F'[^N \t]' 'NF>1'

相关内容