이것은 내 파일의 일부입니다(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'