これは私のファイルの一部です(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
すべての遺伝子型を含む系統を削除し、N以外の遺伝子型が1つ以上ある系統のみを維持したいと思います。これが私が望む結果です:
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の量を修正することができる。
if["$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
フィールド配列の1つ以上の要素が等しくない場合、@F
値はtrueです"N"
。
N以外のアイテムの特定の数をテストしたい場合は、簡単に実行できます。たとえば、N以外のフィールドが1つだけ含まれている行だけを印刷するだけです。
perl -alne 'print if (grep { $_ ne "N" } @F) == 1' file
答え4
使用awk
。空白/空白 (tab+/space)/N 行だけをスキップし、残りを印刷します。
awk -F'[^N \t]' 'NF>1'