条件付きで行を保持

条件付きで行を保持

これは私のファイルの一部です(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'

関連情報