특정 문자를 제외하고 한 줄의 문자 수를 계산하는 방법은 무엇입니까?


9

이것은 부분 파일입니다

N W N N N N N N N N N
N C 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 G N N N N N N N N N
N C N N N C N N N N N
N C C N N N N N N N N

각 줄에서 "N"이 아닌 모든 문자의 총 수를 세고 싶습니다.

내 욕망 출력

1
1
1
0
1
2
2

사용 sed재료를 대체하기 위해 당신은 신경 쓰지 않고 awk남아있는 길이 계산sed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
롤프

답변:


13

GNU awk 솔루션 :

awk -v FPAT='[^N[:space:]]' '{ print NF }' file
  • FPAT='[^N[:space:]]'-필드 값을 정의하는 패턴 ( N문자와 공백을 제외한 모든 문자 )

예상되는 출력 :

1
1
1
0
1
2
2


7

공백 문자 이외의 각 행에 개수가 필요하다고 가정하고 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하면 배열의 요소 수를 제공합니다.

6

대체 awk 솔루션 :

awk '{ print gsub(/[^N[:space:]]/,"") }' file
  • gsub(...)-이 gsub()함수는 대체 횟수를 반환합니다.

출력 :

1
1
1
0
1
2
2

6

또 다른 awk접근법 ( 빈 줄에는 -1 을 반환 합니다).

awk -F'[^N ]' '$0=NF-1""' infile

또는 복잡한 경우 빈 줄에는 -1 을, 공백 (탭 / 스페이스) 줄 에는 0 을 반환 합니다.

awk -F'[^N \t]+' '$0=NF-1""' infile

-1빈 줄 을 인쇄 합니다 ...하지만 N / 공백 대 빈 줄로 구성된 줄을 구별하는 것이 바람직 할 수 있습니다 ...
Sundeep

1
@Sundeep 네, 맞습니다. 또한 참조 선이었다 내 업데이트는 0으로 표시하는 탭 또는 공백이 포함
αғsнιη

5
  1. trPOSIX 쉘 스크립트 :

    tr -d 'N ' < file | while read x ; do echo ${#x} ; done
    
  2. bash, kshzsh:

    while read x ; do x="${x//[ N]}" ; echo ${#x} ; done < file
    

1
awk '{print length()}'더 느린 쉘 루핑을 피하기 위해 사용할 수 있습니다 . 그러나 그 다음에 awk 자체로 모든 것을 할 수 있습니다 ...
Sundeep

@Sundeep, 사실, ( 둘 다 동시에 시작 되면 ) awk루핑 쉘 루핑보다 빠릅니다. 그러나 셸은 항상 메모리에 있으며 로드되지 않았거나 스왑 아웃되지 않은 awk경우 awk로드 오버 헤드 ( 손실 된 시간 )가 실행 이점보다 awk특히 작을 수 있습니다. 고리. 이러한 경우 ( 즉, 이 경우) 속도awk느려질 수 있습니다 .
agc

글쎄, 확실히 작은 물건을위한 시간에 대해 걱정하지 않는다 ... unix.stackexchange.com/questions/169716/…
Sundeep

1
@Sundeep, 내가 걱정. 얼마 전에 나는 플로피 기반의 Linux distros 를 사용 했는데, 이는 플로그를 약간 램에서 떨어 뜨릴 수 있습니다. awk셸 스크립트에서 쓸데없이 사용 하면 그러한 시스템이 4 개 모두에서 크롤링 될 수 있습니다. 일반적으로 동일한 지연 시간 드래그가 제한된 펌웨어의 시스템 또는로드가 많은 시스템에 적용됩니다.
agc

1

의 짧은 조합 trawk:

$ tr -d ' N' <file.in | awk '{ print length }'
1
1
1
0
1
2
2

입력 파일에서 Ns의 모든 공백을 삭제하고 awk각 줄의 길이 만 인쇄합니다.


0

또 다른 쉬운 방법은 대부분의 유닉스 환경에 사전 설치된 파이썬에서 수행하는 것입니다. 다음 코드를 .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

터미널에서. 위의 내용은 다음과 같습니다.

  • "geno"라는 파일의 각 줄마다
  • 카운터를 0으로 설정하고 값을 찾을 때마다 증가시킵니다! = 'N'
  • 현재 줄의 끝에 도달하면 카운터를 인쇄하고 다음 줄로 이동하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.