조건부로 행 유지

조건부로 행 유지

이것은 내 파일의 일부입니다(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이 아닌 유전자형이 하나 이상 있는 계통만 유지하고 싶습니다 . 이것이 내가 원하는 결과입니다:

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필드 배열의 요소 중 하나 이상이 와 같지 않은 경우 @F값이 true입니다 "N".

N이 아닌 항목의 특정 수를 테스트하려는 경우 쉽게 수행할 수 있습니다. 예를 들어 N이 아닌 필드가 정확히 하나만 포함된 행만 인쇄하면 됩니다.

perl -alne 'print if (grep { $_ ne "N" } @F) == 1' file

답변4

사용 awk. 빈/공백(tab+/space)/N 줄만 건너뛰고 나머지를 인쇄합니다.

awk -F'[^N \t]' 'NF>1'

관련 정보