그래서 저는 텍스트 파일의 인수를 받아들이고 해당 파일의 총 줄 수를 출력하는 스크립트를 작성하고 있습니다. 예를 들어 내가 이렇게 말하면
./myScript file1 file2 file3
그것은 인쇄됩니다
10 total
(이 세 파일의 모든 줄의 합은 10이라고 가정합니다.)
나는 모든 주장을 검토하는 방법을 알고 있습니다. 나는 또한 파일의 줄 수를 얻으려면 다음과 같이 말할 것임을 알고 있습니다.
wc -l < fileName
그러나 이것을 일종의 누적 합계에 추가할 수 있는 "int"로 어떻게 바꿀 수 있습니까?
답변1
cat
간단히 파이프를 사용하여 목표를 달성할 수 있습니다 .
cat "$@" | wc -l
정말로 수동으로 합계를 계산하려면 awk를 사용하면 됩니다.
for f in "$@"; do
wc -l < "$f"
done | awk '{ sum+=$1 } END { print sum }'
또는 마지막 줄을 구문 분석하려면 wc
"total" 문자열을 제거하세요.
wc -l "$@" | awk 'END { print $1 }'
답변2
Jordan의 답변을 바탕으로 :
1. 단일 인스턴스를 통해 모든 데이터 전송wc -l
if["$#"-gt 0] 그 다음에 고양이——“$@”|화장실-l 기타 에코 0 필리핀 제도또는
고양이 - /dev/null "$@" 화장실 -l |
-- "$@"
다음으로 시작하는 파일 이름을 방지 하는 데 사용됩니다 .-
.- 인수 없이 호출 하지 마세요
cat
. 이렇게 하면 표준 입력을 읽게 됩니다. - 이것은 끔찍한의 고전적인 형태라는 점에 유의하십시오.
cat a_single_file | something
고양이의 쓸모없는 사용, 하지만 괜찮습니다(아직 이상적이지는 않지만).cat one_or_more_file(s) | something
wc
2. "total" 라인이 방출된다는 사실에 의존
if["$#"-gt 0] 그 다음에 wc -l -- /dev/null "$@" | wc -l -- /dev/null "$@" | 기타 에코 총 0개 필리핀 제도또는
wc -l -- /dev/null /dev/null "$@" | wc -l -- /dev/null /dev/null "$@" |
wc
이 줄은 파일 이름 인수가 두 개 이상 있는 경우에만 내보내집니다 .total
3. 사용 awk
하지 않고 사용wc
if["$#"-gt 0] 그 다음에 awk 'END {NR 인쇄}' -- "$@" 기타 에코 0 필리핀 제도또는
awk 'END {print NR}' -- /dev/null "$@"
경고하다:
위의 명령은 파일 중 개행 문자가 아닌 문자로 끝나는 경우 모두 동일한 응답을 생성하지 않습니다.
답변3
sed -ne\$= files...
sed
대신 원하는 수의 파일 이름을 제공하십시오 .files...
그리고 모든 내용을 읽었으면 =
입력의 마지막 줄 번호를 보고합니다.$