특정 문자열이 포함된 행을 유지하는 방법

특정 문자열이 포함된 행을 유지하는 방법

다음과 같은내 이전 질문, 행을 어떻게 유지합니까?단 하나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이 아닌 최대 하나(빈 줄 또는 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

관련 정보