배경
다음과 같은 이름의 텍스트 파일이 있습니다 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)와 같이 간격 사이의 값 수를 계산합니다.
내 생각
웹서핑과 게시물 검색을 좀 해봤습니다. 나는 이것을 찾았고 도움 awk
이 grep -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 <= ...)
.