다음과 같은내 이전 질문, 행을 어떻게 유지합니까?단 하나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이 아닌 최대 하나(빈 줄 또는 N
s만 포함하는 줄과도 일치함)
입력에는 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