下列的我之前的问题,我怎样才能保留行只有一个非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(也匹配空行或仅包含N
s 的行)。
由于输入似乎只包含可移植字符集中的字符,因此您可能需要将语言环境固定为 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