特定の文字列を含む行を保持する方法

特定の文字列を含む行を保持する方法

次のような私の前の質問、行をどのように維持しますか?単一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以外の文字を1つだけ含む行を印刷します。

または同じですが、異なる方法です。

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

まず、複数行を含むすべての行を削除します。Nではない次の文字のみを含む行を削除してください。窒素数値。

答え2

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

N以外の唯一のケース。

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

N以外の最大1つ(空行またはNsのみを含む行とも一致)

入力にはPortable Character Setの文字のみが含まれているように見えるため、作業を高速化するためにロケールを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の量を修正することができる。

if["$n"=="10"]

非常にエレガントではありませんが、作業が完了し、何も必要ありません。

答え4

もう一つのsed答え:

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

それとも

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

関連情報