如何保留具有特定字符串的行

如何保留具有特定字符串的行

下列的我之前的问题,我怎样才能保留行只有一个非N基因型?

A N N A N N A N N N N
N N N C N N N N N N N
N N N N N N G N N N N
N N N T N N N N N N N
G N N N G N N N N N N
C N N C N C N N N N N

我想要的输出:

N N N C N N N N N N N
N N N N N N G N N N N
N N N T N N N N N N N

答案1

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

打印仅包含一个非 N 字符的行。

或者,同样,但以另一种方式。

sed '/[^N ][N ]*[^N ]/d; /^[N ]*$/d' input.txt

首先,它删除包含多个的所有行非N字符,然后删除仅包含的行人物。

答案2

grep -x '[N ]*[^N ][N ]*'

对于一个且唯一一个非 N。

grep -v '[^N ].*[^N ]'

至多一个非 N(也匹配空行或仅包含Ns 的行)。

由于输入似乎只包含可移植字符集中的字符,因此您可能需要将语言环境固定为 C 以加快速度 ( LC_ALL=C grep...)。

答案3

您可以创建一个包含以下内容的脚本:

#!/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”]

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

答案4

另一个 sed 答案:

sed -n 'h; s/[N ]//g; /^.$/ {g; p}' file

或 awk

awk '
    {
        n=0 
        for (i=1; i<=NF; i++) {
            if ($i != "N") n++ 
            if (n > 1) break
        }
    } 
    n == 1
' file

相关内容