grep "^[^#]" file.txt | wc -l
나는 그것을 단일 파일의 줄 수를 계산하는 데 사용했습니다 .
awk
다음으로 시작하지 않는 줄 수를 어떻게 계산 #
하고 이와 같이 파일 이름을 인쇄할 수 있습니까?
file1.txt 30
file2.txt 33
....
답변1
다음 방법으로 이 작업을 수행할 수도 있습니다 grep
.
grep -c "^[^#]" *
또는
grep -cv "^#" *
전자는 빈 줄도 제외합니다. 후자는 그렇지 않습니다.
현재 디렉터리에 단일 파일이 있으면 파일 이름이 표시되지 않습니다. grep
일부 버전(GNU 포함)에서는 다음 옵션을 추가하여 이를 방지할 수 있습니다.grep
-H
grep -cvH "^#" *
GNU는 grep
또한 다음과 같은 내림차순 디렉터리 트리의 재귀 검색을 지원합니다.
grep -rcvH "^#" .
출력이 요구 사항과 일치하지 않아 다음과 같이 표시됩니다.
file1.txt:30
file2.txt:33
하지만 이 문제는 출력을 파이핑하여 해결할 수 있습니다 sed 's/:\([^:]*\)$/ \1/'
.
답변2
수행할 수 있는 작업은 다음과 같습니다 awk
( awk에도 동일하게 ^[^#]
적용되지만 정규식 일치에서 슬래시 쌍 안에 작성됩니다 (다른 방법도 있음)).grep
awk
/.../
find . -type f -exec \
awk '/^[^#]/ {count++}; END{ print FILENAME, count+0 }' {} \;
또는 GNU awk가 있는 경우ENDFILE{}
막힘:
gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' ./multiple.files*
또는 재귀적으로:
find . -type f -exec \
gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' {} +
노트:
- 를 사용하면
/^[^#]/
빈 줄 계산을 건너뜁니다. _ - 을 사용하는 것은 입력에 빈 줄이 없는 경우에만 조건부와 동일합니다
!/^#/
. 그렇지 않으면 빈 줄도 계산됩니다. 이것이 실제로 수행되는 작업이며 요청할 때 더 정확합니다./^[^#]/
!/^#/
"#으로 시작하지 않는 줄 계산" !/^#/
정확히 동일합니다/^([^#]|$)/
(따라서 둘 다 빈 줄도 계산합니다)
위의 사항을 고려하여 "#으로 시작하지 않는 줄 계산"과 같이 빈 줄도 계산하려면 다음을 수행하십시오.
awk '!/^#/{count++} END{ print FILENAME, count+0 }'
또는 그에 상응하는 것:
awk '/^([^#]|$)/{count++} END{ print FILENAME, count+0 }'
또는 (권장@에드모턴):
awk '/^#/{ count++ } END{ print FILENAME, FNR-count }'
그리고 GNU awk 형식에도 동일한 접근 방식을 적용합니다.
awk '/^#/{ count++ } ENDFILE{ print FILENAME, FNR-count; count=0 }'
파일이 주석 줄로 가득 차 있을 때 인쇄 출력을 건너뛰려면 다음을 수행하십시오.
awk '/^#/{ count++ } END{ if(count) print FILENAME, FNR-count }'
답변3
for i in *
do
if [[ -f "$i" ]]
then
co=$(grep -vc "^#" "$i" )
echo "$i $co"
fi
done
답변4
그리고perl
find . -type f -exec perl -lnse '
/^#/ || $c++;
eof && (print($ARGV,$c),$c=0);
' -- -,=: {} +
POSIXly를 사용하십시오 awk
.
find . -type f -exec awk -v OFS=: '
FNR==1 && NR>1 {
print prev, knt+0
knt=0
}
substr($0,1,1) != "#"{knt++}
FILENAME != prev {prev=FILENAME}
END { print prev, knt+0 }
' {} +