【Linux】大きいファイルを扱う際のコマンド

■ はじめに

テキストエディタでも開けないファイルを扱うことが多くなった。
そんな際に、Linuxコマンドをよく使ったので、メモ。

目次

【1】head / tail
【2】split
【3】wc
【4】file / nkf
【5】grep (fgrep)
【6】diff / md5sum
【7】du

【1】head / tail

行頭・行尾から指定数、ファイル内容を抜き出す
=> 以下の関連記事も参照。

ファイルの内容を表示するコマンド
https://dk521123.hatenablog.com/entry/2016/08/08/235934

サンプル

# 1行目を表示
head -n 1 hello_world.csv

# 100行目まで out.csv として保存
head -n 100 hello_world.csv > out.csv

応用:何行目から何行目まで抜き出す

# 50行目~100行目まで out.csv として保存
head -n 100 hello_world.csv | tail -n 50 > out.csv

【2】split

ファイルを分割する。

サンプル

# 指定行数でファイル分割
# -l 行数    分割ファイルの行数を指定する
# -a 長さ    接尾辞の長さ(デフォルトは2文字)
# -d 接尾辞を英字ではなく数字にする(00から)
# [入力ファイル (hello_world.csv)] [出力ベース名 (hello_world_)]
split -l 100000 -a 4 -d hello_world.csv hello_world_

# hello_world_0000, hello_world_0001, ...

参考文献

https://www.atmarkit.co.jp/ait/articles/1711/24/news016.html
https://takuya-1st.hatenablog.jp/entry/2018/04/25/083000

【3】wc

ファイルの行数や単語数をカウントする際に使える

サンプル

# データ行数を表示
wc -l hello_world.csv

例1:シェルで行数だけとりたい場合

$ cat sample.py | wc -l
5

https://qiita.com/wyamamo/items/bc23a3f8cce2cff1babb

例2:ファイルサイズをとりたい場合

$ wc -c sample.py | awk '{print $1}'
2609829

https://ameblo.jp/archive-redo-blog/entry-10196055325.html

例3:ファイル数のカウント
https://qiita.com/frozencatpisces/items/9e09f55ede49ef0c64dd

# -F"オプションを使用すると、対象のタイプに応じて末尾に記号が付与
$ ls -F

# ディレクトリの場合は"/"が付与されるので、除外
$ ls -F | grep -v /

# それをカウント
$ ls -F | grep -v / | wc -l

参考文献

https://www.atmarkit.co.jp/ait/articles/1611/07/news026.html

【4】file / nkf

ファイルの文字コードを調べるのに使用

サンプル

file hello_world.csv
# hello_world.csv: ASCII text, with CRLF line terminators

参考文献

https://blog.katsubemakito.net/linux/what-character-encoding

【5】grep (fgrep)

* 特定行を抽出するのに便利なコマンド
* 詳細は、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2017/08/06/213100

構文

grep [キーワード] [ファイル名]

# 複数キーワードがある場合
grep -e [キーワード1] -e [キーワード2] ... [ファイル名]

# 1件しかヒットしないことが分かる場合(例えば、IDで検索など)
grep -m 1 [キーワード] [ファイル名]

# 再帰的に検索(-r : 再帰、-l : バイナリー除外)
grep -r 検索文字列 ディレクトリ
# e.g. grep -rl 'hello' /user/world/

https://morinohito.site/it/command/grep-directory-detail

サンプル

$ grep sample1@gmail.com data.csv
00-111-222,sample1@gmail.com,xx1

$ fgrep -e 00-111-222 -e 00-111-228 data.csv
00-111-222,sample1@gmail.com,xx1
00-111-228,sample7@gmail.com,xx7

$ grep -m 1 sample1@gmail.com data.csv
00-111-222,sample1@gmail.com,xx1

サンプルデータ:data.csv

00-111-222,sample1@gmail.com,xx1
00-111-223,sample2@gmail.com,xx2
00-111-224,sample3@gmail.com,xx3
00-111-225,sample4@gmail.com,xx4
00-111-226,sampl5e@gmail.com,xx5
00-111-227,sampl6e@gmail.com,xx6
00-111-228,sample7@gmail.com,xx7
00-111-229,sample8@gmail.com,xx8
00-111-230,sample9@gmail.com,xx9

おまけ:シェルにして出力結果をファイルとして保存

#!/bin/bash

fgrep -e 00-111-222 -e 00-111-228 data.csv > test.csv

echo Done. See test.csv

出力結果:test.csv

00-111-222,sample1@gmail.com,xx1
00-111-228,sample7@gmail.com,xx7

参考文献

https://www.sejuku.net/blog/48915

【6】diff / md5sum

diff

* ファイル差分を抽出するコマンド
* 「-s」だと同一かどうか教えてくれる

https://ex1.m-yabe.com/archives/3352

md5sum

* ファイルのチェックサムを算出してくれるコマンド
 => 詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2017/01/30/220600

サンプル

$ md5sum sample.py
e32c527814400081add7996e4122a5bc *sample.py

# コピーしただけ
$ cp sample.py sample1.py

$ md5sum sample1.py
e32c527814400081add7996e4122a5bc *sample1.py

$ diff -s sample.py sample1.py
Files sample.py and sample1.py are identical

【7】du

* ディスクの使用量を表示する

https://atmarkit.itmedia.co.jp/ait/articles/1610/25/news016.html

コマンド例

# ディスク容量がでかいTop5を表示
du | sort -nr | head -n 5

関連記事

文字列検索 / グレップ ~ grep / egrep / fgrep ~
https://dk521123.hatenablog.com/entry/2017/08/06/213100
md5sum ~ MD5ハッシュ値を返す ~
https://dk521123.hatenablog.com/entry/2017/01/30/220600
ファイルの内容を表示するコマンド
https://dk521123.hatenablog.com/entry/2016/08/08/235934
ファイル内容を操作するコマンド
https://dk521123.hatenablog.com/entry/2023/07/26/000000
Linux ~ パフォーマンスに関わるコマンド ~
https://dk521123.hatenablog.com/entry/2015/02/21/112554