ファイル内の行数を数える


64

これを行うには多くの方法があると確信しています:テキストファイルの行数をどのように数えることができますか?

$ <cmd> file.txt
1020 lines

回答:


98

標準的な方法はwc、を使用する方法です。引数を使用して、カウント対象(バイト、文字、単語など)を指定します。-l回線用です:

$ wc -l file.txt
1020 file.txt

コメントを無視したい場合、ファイル内の行をカウントするにはどうすればよいですか?具体的には、+で始まり、空白(空白でない場合があります)で始まり、MATLABファイルのgit diffでコメント行が表示される方法である%で始まる行をカウントしません。これをgrepで試しましたが、正しい正規表現がわかりませんでした。
グダリヤ

@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 14

@celtschk、これがコメント行で通常である限り:(の前のスペースに注意してください)のgrepようなコメントケースと見なすためにコマンドを変更することは可能ですか?" + Hello"+
ソパラホデアリエレス

1
@SopalajodeArrierez:もちろん可能です:(grep -v '^ *+' matlab.git.diff | wc -l引用符は実際には行の一部であることを意図していないと仮定し+ます。少なくとも1つのスペースが必須です。星*\+に置き換えるか、星の前に別のスペースを追加するだけです。おそらくスペースだけを一致させるのではなく、任意の空白を一致させたいでしょう。このため、スペースをに置き換え[[:space:]]ます。%あなたの例にはないので、マッチングも削除したことに注意してください。
celtschk

15

マイケルが言っwc -lたように、行くべき道です。しかし、どういうわけかあなたが不可解に持っているbash場合perl、またはawkそうwcではないが、いくつかのソリューションがあります:

バッシュのみ

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

Perlソリューション

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

そしてはるかに読みにくい:

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

Awkソリューション

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

15

スティーブンDは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純粋で(ba)sh 以外に有用ですか?
ジル「SO-悪であるのをやめる」

1
@Gilles:質問の「多くの方法」というフレーズが、スティーブと私が挑戦した挑戦を引き起こしたと思います。
デニスウィリアムソン

1
@Gilles:sed 's/.*//' file.txt | uniq -c
デニスウィリアムソン

2
@Gilles:ああ、あなたは最初に意味した。番号のみを保持uniq -c -w 0 file.txtすることができますcut -c -7。それとも、もっとPOSIXly: 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
デニスウィリアムソン

1
@JosipRodin:引用が追加されました
デニスウィリアムソン

11

使用時の警告の言葉

wc -l

wc -lは\ nをカウントすることで機能するため、ファイルの最終行が事実上改行で終わっていない場合、行カウントは1オフになります(したがって、ファイルの末尾に改行を残す古い規則)。

特定のファイルが最後の行を改行で終了する規則に従っているかどうかはわからないので、改行に関係なくカウントに最後の行を含めるこれらの代替コマンドを使用することをお勧めします。

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

いい要約。UnixとLinux
セバスチャン14

うーん、最後のピースは本当にラインですか?
gena2x 14

1
みんなのユースケースに依存すると確信しています。「最後のピース」は通常、誰かが改行で終わらせなかったテキスト行です。私が最も頻繁に遭遇するユースケースは、改行で終わらない単一のテキスト文字列を持つファイルです。wc -lは、「0」としてカウントしますが、そうでなければ「1」のカウントを期待します。
pretzels1337 14

3

bashのみがあり、外部ツールがまったく使用できない場合は、次のこともできます。

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

説明:ループは標準入力を1行ずつread読み取ります(;とにかく読み取り入力には何もしないため、格納する変数は提供されません)、そのcountたびに変数を増やします。リダイレクトのため(の<file.txtdone)、ループの標準入力はからfile.txtです。


2

このコマンドはいつでもgrep次のように使用できます。

grep -c "^" file.txt

file.txt最後の行に末尾にLF文字が含まれているかどうかにかかわらず、のすべての実際の行をカウントします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.