テキストファイルの操作
テキストファイルとバイナリファイル
- ファイルとは、本質的にはバイト列(データの羅列)です。
- 文字もデータの一種であり、文字コード(例:UTF-8, ASCII)に従って表現されます。
- テキストファイルとは、文字データのみで構成されており、人間が直接読める形式のファイルを指します(例:
.txt
,.csv
,.py
)。 - バイナリファイルとは、文字以外のデータ(画像・音声・実行ファイルなど)を含むファイルの総称であり、テキストとして開くと意味不明な記号が並んでいます。
文字コードと特殊文字に関する注意点
落とし穴 | 具体例 | 対策 |
---|---|---|
全角/半角の混在 | ABC.txt と ABC.txt は別ファイル扱い |
ファイル名・入力データは 半角(ASCII) を原則にする |
全角スペース・半角スペース | ファイル 名.txt (全角空白)、file name.txt (半角空白) |
どちらも見分けにくいので 空白を避ける or "引用符" で囲む |
タブ文字 | 行頭インデントがスペースかタブか不明 | エディタで「タブ可視化」設定+ tab → 4 space 変換 ルールを統一 |
不可視制御文字 | 0x1B (ESC) などが混入し、CSV 解析時にエラー | cat -v / od -c で点検、不要なら tr -d で除去 |
改行コード差 | Unix: LF (\n )、Windows: CRLF (\r\n ) |
Git の core.autocrlf を設定、dos2unix /unix2dos で変換 |
Unicode 正規化の揺れ | é (U+00E9) vs e +́ (U+0065 U+0301) |
入出力を UTF-8 NFC に統一、iconv ・uconv で整形 |
ファイルの種類 file
file
コマンドを使うと、ファイルの種類を自動で判別できます。
$ file hello.txt
hello.txt: ASCII text
$ file image.png
image.png: PNG image data, 800 x 600, 8-bit/color RGB, non-interlaced
$ file script.py
script.py: Python script, UTF-8 Unicode text
$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
テキストファイルの編集 vi
$ vi filename.txt
- Linuxなら大抵インストールされているため使えると便利です
- 実際の利用方法は長くなるので各自で調べてください
- 最低限、終了方法だけは覚えておきましょう (
<Esc>ZZ
または<Esc>:q!
)
テキストファイルの閲覧 cat, less, head, tail
cat file.txt
less file.txt
head -n 10 file.txt
tail -f file.txt
less
は長いファイルをページ送りで見る際に便利tail -f
は末尾に更新が続くログファイルなどを読み続ける際に便利
テキストファイルの検索 grep
grep "keyword" file.txt
grep -r "pattern" ./ # ディレクトリ以下を再帰的に検索
正規表現が利用可能です。
テキストファイルの置換 sed
# input.txtのoldをnewに置換してoutput.txtに書き込み
$ sed 's/old/new/g' input.txt > output.txt
複数のファイルにまたがって置換操作する場合に便利です。 正規表現が利用可能です。
テキストファイルの差分 diff
$ echo 'abc\ndef\nghi' > a.txt
$ echo 'abc\nfed\nghi' > b.txt
$ diff a.txt b.txt
2c2
< def
---
> fed
テキストの加工・集計 awk
# data.txt の各行について、1列目と3列目を表示
$ awk '{ print $1, $3 }' data.txt
# data.txt の2列目が 100 より大きい行全体を表示
$ awk '$2 > 100 { print $0 }' data.txt
テキストファイルを行単位で読み込み、フィールド(列、デフォルトはスペースやタブ区切り)ごとに分割して処理を行う強力なコマンドです。
特定のパターンにマッチした行に対して、指定したアクション(表示、計算など)を実行できます。簡単なデータ抽出、集計、レポート作成などによく利用されます。
$1
, $2
などでフィールドを参照し、$0
で行全体を参照します。
書式付き文字列の出力 printf
$ printf "Hello World\n"
Hello World
$ USER="Bob"
$ ID=123
$ printf "User: %s, ID: %d\n" "$USER" $ID
User: Bob, ID: 123
$ VALUE=42
$ printf "File Name: z%04d.txt\n" $VALUE
File Name: z0042.txt
文字コード・改行コードの判別・変換 nkf
# file.txt の文字コードと改行コードを判別して表示
$ nkf -g file.txt
UTF-8 # または Shift_JIS など、文字コードの判別結果が出力される
# --guess オプションでは文字コードに加えて改行コードの判別結果も出力
$ nkf --guess file.txt
UTF-8 (CRLF)
文字コード・改行コードを判別するだけでなく、異なる文字コード・改行コードに変換することも可能です。
演習: テキストファイルの操作
vi
を使ってHello World!
と記入されたファイルhello_world.txt
を作りましょう。sed
を使ってhello.txt
からHello Linux!
と書かれたファイルhello_linux.txt
を作りましょう。hello_world.txt
とhello_linux.txt
をdiff
で比較しましょう。vi
を使ってhello_word.txt
を編集し、内容をHello Linux!
に変更しましょう。hello_world.txt
とhello_linux.txt
をdiff
で比較して両者が一致することを確認しましょう。