숫자가 포함되지 않은 행 수를 계산하는 스크립트

숫자가 포함되지 않은 행 수를 계산하는 스크립트

안녕하세요 여러분, 약간의 운동을 도와주실 수 있는지 궁금합니다.

  1. while루프를 사용하여 .bashrc파일을 한 줄씩 읽고 숫자가 없는 줄 수를 계산합니다.

기본적으로 이것은 스크립트이지만 아무것도 알아낼 수 없는 것 같습니다. 도움이나 조언을 주시면 감사하겠습니다. 이런 경우에도 사용이 가능한지 알고 싶습니다 grep.awk

내 시도:

cat .bashrc | while read line; 
do if [ check_if_there_is_no_number_in $line ]; 
then increase_your_index>
fi done

스크립트 작성에 도움을 줄 수 있는 사람이 있나요? 미리 감사드립니다.

답변1

예, 다음을 grep사용하여 이 작업을 수행할 수 있습니다.

grep -c -v '[[:digit:]]' ~/.bashrc

~/.bashrc파일을 한 줄씩 읽습니다 . 행에 숫자가 포함되어 있으면("숫자"를 감지하기에 충분하다고 가정) 해당 숫자는 삭제됩니다. 나머지 행이 계산되고 숫자가 없는 총 행 수가 표시됩니다.

및 옵션에 대한 설명을 참조하세요 man grep. 그러나 기본적으로 (행 자체가 아닌) 일치하는 행의 수를 반환하고 일치의 의미를 반전시켜 해당 행만 반환하도록 합니다.-c-v-cgrep-v아니요주어진 패턴과 일치하는 결과를 반환합니다.

이 패턴은 [[:digit:]]숫자가 포함된 모든 줄과 일치합니다.


를 사용하면 awk행 수를 직접 추적해야 합니다.

awk '!/[[:digit:]]/ { count++ } END { print count }' ~/.bashrc

여기서 !현재 행의 숫자 앞에 오는 테스트는 테스트의 의미를 반전시킵니다. 행이 성공적으로 테스트되면 이 변수가 count증가됩니다. END더 이상 읽을 행이 없을 때 이 블록이 실행되고 현재 값이 출력됩니다 count.

다음과 같은 파일이 발생할 것으로 예상되는 경우 이 스크립트를 개선해야 합니다.아니요숫자가 없는 행 count(예:비어 있는(아니요 0). 예를 들어 블록을 사용하거나 BEGIN { count = 0 }with 문에서 산술 평가를 강제하여 수행할 수 있습니다 .printprint 0+count


"를 읽고 이해했다고 가정합니다.쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?" 그리고""IFS=read-r-line" 이해", 교사의 요구 사항을 충족하기 위해 /bin/sh다음 스크립트를 사용할 수 있습니다.

#!/bin/sh

count=0
while IFS= read -r line; do
    case $line in
        *[[:digit:]]*)
            ;;
        *)
            count=$(( count + 1 ))
    esac
done < ~/.bashrc

printf 'There are %d lines with no digit\n' "$count"

또는 bash,

#!/bin/bash

count=0
while IFS= read -r line; do
    [[ $line != *[[:digit:]]* ]] && count=$(( count + 1 ))
done < ~/.bashrc

printf 'There are %d lines with no digit\n' "$count"

grepawk솔루션은 정규식 일치를 사용 하지만 여기에 표시된 두 루프는 "와일드카드 패턴"을 사용하여 숫자를 일치시킵니다.

개인적으로는 더 간단한 솔루션을 선택하겠습니다 grep. 동일한 기능이 내장되어 있으면 불필요하기 while때문에 프로덕션 코드에서 위 루프를 "수정" 하지 않을 것입니다 . grep게다가 나는 글을 작성할 때 두 가지 오타와 누락을 수정해야 했는데, 이는 엉성한 프로그래머가 단순한 해결책보다 더 많은 실수를 할 수 있다는 것을 의미합니다 grep.

관련 정보