과학적 표기법으로 텍스트 파일에서 특정 숫자의 빈도를 계산합니다.

과학적 표기법으로 텍스트 파일에서 특정 숫자의 빈도를 계산합니다.

배경

다음과 같은 이름의 텍스트 파일이 있습니다 blood_conc.txt.

  0, 0, 0, 0, 0, 0, 0, 1.32006590271e-05, 1.990014992001e-05, 1.504668143682e-05, 2.176900659261e-06,
    7.673488970859e-06, 2.169217049562e-05, 4.343183585883e-05, 0, 0, 0, 0, 0, 0, 0,
    2.143804950099e-05, 0, 0, 1.849919603625e-06, 0, 0, 0, 0, 0, 0, 0, 4.123812986073e-07, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0.0001365177, 7.81009e-06, 2.695291e-07, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0,
  0, 0, 0, 0, 0, 0, 0, 2.1799e-05, 1.82574e-05, 1.68109e-05, 2.722782e-05,
    5.355517e-05, 8.196468e-05, 7.177729e-05, 7.863765e-05, 5.774439e-05,
    1.329413e-08, 0, 0, 0, 4.320018e-06, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0.0003335425, 0, 0, 0, 0, 0, 0, 0, 0, 6.061237e-05, 6.36887e-05,
    2.250928e-05, 0, 0, 7.327124e-07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

몇 개나 있는지 세어보고 싶어03~8행 사이(포함)입니다. 즉

2.143804950099e-05, 0, 0, 1.849919603625e-06, 0, 0, 0, 0, 0, 0, 0, 4.123812986073e-07, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0.0001365177, 7.81009e-06, 2.695291e-07, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0,
  0, 0, 0, 0, 0, 0, 0, 2.1799e-05, 1.82574e-05, 1.68109e-05, 2.722782e-05,
    5.355517e-05, 8.196468e-05, 7.177729e-05, 7.863765e-05, 5.774439e-05,

및 빈도054여야 합니다.

나는 두 가지 작업을 수행하기 위해 간단한 명령줄을 원합니다.

작업 1: 총 개수03~8행의 텍스트입니다.

작업 2: (2.452555e-05, 0.0032784)와 같이 간격 사이의 값 수를 계산합니다.


내 생각

웹서핑과 게시물 검색을 좀 해봤습니다. 나는 이것을 찾았고 도움 awkgrep -c될 수 있습니다.

라인 범위에 집중하려면 awk 'NR==3, NR==8' blood_conc.txt.

grep그러나 or 을 사용하여 진행하는 방법을 모르겠습니다 perl. 주파수만 반환하는 간단한 명령줄을 원합니다.

답변1

다음을 시도해 볼 수 있습니다 awk.

awk -F"," 'NR == 3, NR == 8 { for (i = 1; i <= NF; i++) { if ($i == 0) { cnt++; } if ($i >= 2.452555e-05 && $i <= 0.0032784) { cnt1++; } } } END { print cnt, cnt1; }' file

답변2

시작점은 좋습니다. 이제 적절한 필드 구분 기호를 정의하는 것이 전제 조건인 필드를 반복해야 합니다. 0의 개수를 세어보세요.

awk '
  BEGIN { FS="[, ]+" }
  NR==3, NR==8 { for (i=1; i<=NF; i++) if ($i==0) c++ }
  END { print c }
'

범위를 확인하려면 if그에 따라 조건을 변경하십시오(예: ) if ($i >= ... && $i <= ...).

관련 정보