답변:
GNU awk 솔루션 :
awk -v FPAT='[^N[:space:]]' '{ print NF }' file
FPAT='[^N[:space:]]'
-필드 값을 정의하는 패턴 ( N
문자와 공백을 제외한 모든 문자 )예상되는 출력 :
1
1
1
0
1
2
2
공백 문자 이외의 각 행에 개수가 필요하다고 가정하고 N
$ perl -lne 'print tr/N //c' ip.txt
1
1
1
0
1
2
2
tr
은 교체 된 문자 수입니다.c
주어진 문자 세트를 보완하기 위해-l
옵션 사용에 유의하십시오. 줄 바꿈 오류를 피하기 위해 입력 줄에서 줄 바꿈 문자를 제거하고 print 문에 줄 바꿈 문자를 추가합니다
보다 일반적인 솔루션
perl -lane 'print scalar grep {$_ ne "N"} @F' ip.txt
-a
@F
배열에 저장된 공백에서 입력 라인을 자동으로 분할하는 옵션grep {$_ ne "N"} @F
@F
문자열과 일치하지 않는 모든 요소의 배열을 반환 합니다.N
grep {!/^N$/} @F
scalar
하면 배열의 요소 수를 제공합니다.대체 awk 솔루션 :
awk '{ print gsub(/[^N[:space:]]/,"") }' file
gsub(...)
-이 gsub()
함수는 대체 횟수를 반환합니다.출력 :
1
1
1
0
1
2
2
또 다른 awk
접근법 ( 빈 줄에는 -1 을 반환 합니다).
awk -F'[^N ]' '$0=NF-1""' infile
또는 복잡한 경우 빈 줄에는 -1 을, 공백 (탭 / 스페이스) 줄 에는 0 을 반환 합니다.
awk -F'[^N \t]+' '$0=NF-1""' infile
-1
빈 줄 을 인쇄 합니다 ...하지만 N / 공백 대 빈 줄로 구성된 줄을 구별하는 것이 바람직 할 수 있습니다 ...
tr
및 POSIX 쉘 스크립트 :
tr -d 'N ' < file | while read x ; do echo ${#x} ; done
bash
, ksh
및 zsh
:
while read x ; do x="${x//[ N]}" ; echo ${#x} ; done < file
awk '{print length()}'
더 느린 쉘 루핑을 피하기 위해 사용할 수 있습니다 . 그러나 그 다음에 awk 자체로 모든 것을 할 수 있습니다 ...
awk
셸 스크립트에서 쓸데없이 사용 하면 그러한 시스템이 4 개 모두에서 크롤링 될 수 있습니다. 일반적으로 동일한 지연 시간 드래그가 제한된 펌웨어의 시스템 또는로드가 많은 시스템에 적용됩니다.
또 다른 쉬운 방법은 대부분의 유닉스 환경에 사전 설치된 파이썬에서 수행하는 것입니다. 다음 코드를 .py 파일에 놓으십시오.
with open('geno') as f:
for line in f:
count = 0
for word in line.split():
if word != 'N':
count += 1
print(count)
그리고 나서 :
python file.py
터미널에서. 위의 내용은 다음과 같습니다.
sed
재료를 대체하기 위해 당신은 신경 쓰지 않고awk
남아있는 길이 계산sed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'