파일에서 줄을 세다


64

이 작업을 수행하는 방법에는 여러 가지가있을 것입니다. 텍스트 파일에서 줄 수를 계산하는 방법은 무엇입니까?

$ <cmd> file.txt
1020 lines

답변:


98

표준 방법은 with로 wc계산할 대상 (바이트, 문자, 단어 등)을 지정하는 인수를 사용합니다. -l라인입니다 :

$ wc -l file.txt
1020 file.txt

주석 을 무시 하려면 파일의 행을 어떻게 계산 합니까? 특히, 내가 원하는 하지 A +로 시작하는 라인을 계산, 약간의 공백은 주석 행은 MATLAB 파일의 자식은 diff에 표시되는 방법은 다음과 % (전혀 공백이있을 수 있음). grep 로이 작업을 시도했지만 올바른 정규 표현식을 파악할 수 없었습니다.
Gdalya

@Gdalya 다음 파이프 라인 이이 작업을 수행하기를 바랍니다 (테스트가 수행되지 않았습니다) cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l. /regexp/d일치하는 경우 광고를 삭제 regexp하고 -e대한 적절한 (IMNSHO) 구문 온 regexp.
dbanet

2
왜 간단하지 grep -v '^+ *%' matlab.git.diff | wc -l않습니까?
celtschk

@celtschk만큼이 주석 라인에서 평소와 같이 : 그것은 당신의 수정할 수 grep와 같은 코멘트 사례로 고려하기 위해 명령을 " + Hello"(전과 공간 (들)주의 +)?
Sopalajo de Arrierez

1
@SopalajodeArrierez : 그것은 가능하다 물론 : grep -v '^ *+' matlab.git.diff | wc -l(나는 인용 부호가 실제로 라인의 일부가 될 운명되지 않은 있으리라 믿고있어, 나는 또한와의 앞에 공백없이 두 라인이 있다고 가정 +의견으로 의미;의 경우 별표를 *으로 바꾸거나 별표 \+앞에 다른 공간을 추가 하면 하나 이상의 공백이 필수 입니다. 공백 만 일치시키는 대신 임의의 공백을 일치 시키려고합니다. 이를 위해 공백을로 바꿉니다 [[:space:]]. %귀하의 예에 없기 때문에 일치도 제거 했습니다.
celtschk

15

마이클이 말했듯 wc -l이 갈 길입니다. 그러나, 단지 경우에 당신은 알수없는이 bash, perl또는 awk하지만 wc, 여기에 몇 가지 더 해결 방법은 다음과 같습니다

배쉬 전용

$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT

펄 솔루션

$ perl -lne 'END { print $. }' file.txt

그리고 훨씬 덜 읽기 쉽습니다.

$ perl -lne '}{ print $.' file.txt

Awk 솔루션

$  awk 'END {print NR}' file.txt

15

스티븐 디는 GNU를 잊었다 sed.

sed -n '$=' file.txt

또한 파일 이름을 출력하지 않고 카운트를 원하고 다음을 사용하는 경우 wc:

wc -l < file.txt

그냥 그것을 위해 :

cat -n file.txt | tail -n 1 | cut -f1

2
또는 grep -c '', 또는 tr -dc '\n' | wc -c, 또는 nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'... ... 이것들 자체가 유용 wc -l합니까?
Gilles

1
@Gilles : 질문에 "다양한 방법"이라는 문구가 Steve와 내가 제기 한 도전을 유발했다고 생각합니다.
Dennis Williamson

1
@Gilles :sed 's/.*//' file.txt | uniq -c
Dennis Williamson

2
@Gilles : 아, 당신은 먼저 의미했습니다 . uniq -c -w 0 file.txt당신은 할 수 있습니다 cut -c -7만 수를 유지합니다. 또는 POSIX 더 : uniq -c file.txt | awk '{c+=$1}END{print c}'. 방법에 대해 dc(가 POSIX 아니더라도)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -. bcPOSIX : uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc입니다. 줄 길이를 제한한다고 가정하면 쉽게 답할 수 있습니다 uniq -c -f 100000 file.txt.
Dennis Williamson

1
@JosipRodin : 따옴표 추가
Dennis Williamson

11

사용할 때 경고의 말씀

wc -l

wc -l은 \ n을 계산하여 작동하기 때문에 파일의 마지막 줄이 줄 바꿈으로 끝나지 않으면 줄 수는 1만큼 줄어 듭니다.

주어진 파일이 줄 바꿈으로 마지막 줄을 끝내는 규칙을 따르는 지 여부를 확신 할 수 없으므로 줄 바꿈과 상관없이 마지막 줄을 포함하는 대체 명령을 사용하는 것이 좋습니다.

sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename

좋은 요약. 그리고 유닉스와 리눅스에
Sebastian

흠 마지막 조각이 진짜 선인가요?
gena2x

1
나는 그것이 모든 사람의 유스 케이스에 달려 있다고 확신한다. '마지막 조각'은 대개 누군가가 줄 바꿈을 사용하지 않은 텍스트 줄입니다. 가장 많이 사용되는 유스 케이스는 줄 바꿈으로 끝나지 않는 단일 텍스트 문자열이있는 파일입니다. wc -l은 "1"의 개수를 예상 할 때 이것을 "0"으로 카운트합니다.
pretzels1337

3

bash 만 있고 외부 도구를 사용할 수없는 경우 다음을 수행 할 수도 있습니다.

count=0
while read
do
  ((count=$count+1))
done <file.txt
echo $count

설명 : 루프는 표준 입력을 한 줄씩 읽습니다 ( read; 우리는 읽기 입력으로 아무 것도 수행하지 않기 때문에 변수를 저장할 변수가 제공되지 않습니다) count. 매번 변수가 증가합니다 . 방향 전환 ( <file.txtafter done) 으로 인해 루프의 표준 입력은입니다 file.txt.


2

grep다음과 같이 항상 명령 을 사용할 수 있습니다 .

grep -c "^" file.txt

file.txt마지막 행의 끝에 LF 문자가 포함되어 있는지 여부에 관계없이 의 모든 실제 행을 계산합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.