값이 5보다 작은 열의 수를 행 단위로 계산해야 합니다. 내 데이터는 다음과 같습니다.
1.2 8.9 4.5 2.8
4.9 10.1 15.3 1.1
2.1 4.3 3.9 3.3
.
.
따라서 원하는 출력은 다음과 같습니다.
3
2
4
답변1
레코드당 필드 수(기본적으로 행당 공백으로 구분된 열)는 입니다 NF
. 루프를 사용하여 레코드의 모든 필드를 반복할 수 있습니다 for (i = 1; i <= NF; ++i)
. 필드의 데이터는 루프 내에서 사용할 수 있습니다 i
. $i
예를 들어:
awk '{ count = 0; for (i = 1; i <= NF; ++i) if ($i < 5) ++count; print count }'
아니면 좀 더 자세히 적어서,
awk '
{
count = 0
for (i = 1; i <= NF; ++i)
if ($i < 5)
++count
print count
}'
if
and 문의 본문 for
은 단지 명령문이므로 추가 개행 문자가 필요하지 않습니다 { ... }
(C 프로그래밍 언어와 비슷하지만 Perl과는 다릅니다). 동일한 줄에서 한 문을 다른 문과 분리하려는 경우가 아니면 줄 끝은 필요하지 않습니다(예: ;
위의 두 동등한 코드 조각의 사용법 비교).;
답변2
또 다른 방법은 Perl을 사용하는 것입니다.
perl -alpe '$_ = grep { $_ < 5 } @F' file
grep 결과의 스칼라 할당은 이를 일치하는 요소 수로 변환합니다.
답변3
입력을 실행 tr
하고 다음을 통해 음수를 식별하는 데 사용되는 모든 대시를 밑줄로 변환합니다 dc
.
$ tr \- _ < inp.txt |
dc -e '
[q]sq
[lN1+sN]sa
[5>az0<b]sb
[?z0=q0sNlbxlNpcz0=c]sc
lcx
'