複数ファイルの行数が知りたいくて コマンドで取得してみた


コーディングしていると、、、

みんなどれくらいの大きさのファイル作成してるのかな?
既存のファイルはどれくらいの大きさなのかな?
各ファイルの行数知りたい。

あると思います。

勉強も兼ねて、コマンドで取得してみることにしました!

実行環境

windows10に WSLを利用してLinux(Ubuntu)をインストールしてコマンドしました。

行取得

wcコマンドを使います
以下のように
wc 対象ファイル と記載すると

$ wc *.txt
 13  13  38 t01.txt
 38  33 106 t02.txt
  4   3   7 t03.txt
 21  18  43 t04.txt
 75  33 116 t05Service.txt
 18  16  35 t06Service.txt
148  14 171 t07Service.txt
317 130 516 total

カレントディレクトリに存在するtxtファイルの情報の取得ができます。
取得した情報は項目ごとに表示されています。

行数 単語数 ファイル容量(バイト数)   ファイル名称
13   13     38                t01.txt
...
...
317 130   516      total ここは合計

このままだと余分な情報が多いので
-l オプションで行数のみ取得

~/work$ wc *.txt -l
 13 t01.txt
 38 t02.txt
  4 t03.txt
 21 t04.txt
 75 t05Service.txt
 18 t06Service.txt
148 t07Service.txt
317 total

行数とファイル名のみなのでだいぶ見やすくなりました。

行数順に表示。

wcコマンド パイプ'|' sortコマンドを使用しました。

$ wc *.txt -l | sort
  4 t03.txt
 13 t01.txt
 18 t06Service.txt
 21 t04.txt
 38 t02.txt
 75 t05Service.txt
148 t07Service.txt
317 total

いい感じにファイル行数順に並びました。

次は 「***Service.txt」ファイルだけ取得してみます。

$  wc *Service.txt -l | sort
 18 t06Service.txt
 75 t05Service.txt
148 t07Service.txt
241 total

やった!サービスファイルの行数のみ取得できました。

・・・

今度は、平均を表示!

まず TOTAL の行が邪魔なので削除します。

sedコマンドを使用しました。
これはアドレス部に$を指定すると最後の行を表すのでそれに対してd(削除)を実行します。

$ wc *.txt -l | sort | sed '$d'
  4 t03.txt
 13 t01.txt
 18 t06Service.txt
 21 t04.txt
 38 t02.txt
 75 t05Service.txt
148 t07Service.txt

消えました!
更に
awkコマンドで平均の表示を行います。

$ wc *.txt -l | sort | sed '$d' |  awk '{n += $1}{i +=1 }; END{print int(n/i) }'
45

上記のコマンドから平均行数「45」が取得できました!!

因みに awk が何をしているかというと。。。

   1行毎に 行数をnにプラス  iに+1     全行終わったら   表示  少数点切り捨て(n÷i)
awk       '{n += $1}  {i +=1 };   END       {print  int(n/i) }'

みたいな感じです

wcコマンドのオプションは以下のようなのがあります。

-l
ファイルの行数を表示する。

-c
ファイルのバイト数を表示する。

-m
ファイルの文字数を表示する。

-L
最も長い行のバイト数を表示する。

-w
ファイルの単語数を表示する。

使用しませんでしたが、以下のようなコマンドでファイル数を調べることができるようです。

$ ls -1 | wc -l

lsコマンドのオプションは「-1(数字の1)」
wcコマンドのオプションは「l(アルファベットのLの小文字)」

参考
テキストの最後の行だけ消したい時、どうやればいい?

awkについてメモ