这是我的文件的一部分(有 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'