警告

本資料は参考情報として提供されています。内容についてのご質問には必ずしもお答えできない可能性がございます。

4. テキスト処理#

ここではテキストデータ・ファイルの閲覧・集計・編集によく用いられるコマンドについて記述します。

注釈

本資料では使われることの多い機能に絞って紹介します。実際の機能はコマンドのヘルプやmanコマンドを参照してください。

4.1. ファイルの表示と検索#

4.1.1. file#

fileコマンドはファイルの種類を推定して表示します。

$ file /etc/passwd /etc
/etc/passwd:    ASCII text
/etc:        directory

4.1.2. less#

lessコマンドはテキストファイルを画面に表示する際に最もよく使われるコマンドです。

less [option] file1 [files...]
-S#

右端で行を折り返さない

-m#

表示位置を%で表示する

-M#

表示位置を詳しく表示する

-N#

行番号を表示

-R#

制御文字(例えばANSI Color Escape Sequence)を表示

-U#

空白文字を可視化

lessコマンドを実行するとファイルを閲覧する画面に移行します。lessの画面では専用のキー操作で操作を行います。

基本の操作#

キー

説明

h

ヘルプの表示

q

lessを終了する

矢印キー

上下左右にスクロール

Enter,e,j

1行進む

y,k

1行戻る

Space,f,PgDn

1画面進む

b,PgUp

1画面戻る

<,g,Home

先頭に移動

>,G,End

末尾に移動

ヒント

数字を入力した後、Enter,Space,fe,jのいずれかを押すとその行数分前方にスクロールします。同様に、数字入力とy,kbキーの組み合わせで、後方に指定行数分スクロールします。

検索#

キー

説明

/キーワード

前方検索(/に続けてキーワードを入力)

?キーワード

後方検索

n

次にマッチしたパターンに移動

N

前のマッチしたパターンに移動

その他#

キー

説明

:n

次のファイルを表示(引数に複数のファイルを指定)

:p

前のファイルを表示

v

表示しているファイルをエディタで編集

ヒント

環境変数LESSOPENが適切に設定されている場合、lessコマンドは圧縮ファイルなどをそのまま開くことができます。

4.1.3. more#

lessコマンドの名前の由来となったのがmoreコマンドです。同じくテキストデータを表示させるコマンドで、おおよそlessと同じように操作しますが、今ではほとんど使われません。

4.1.4. cat#

cat(concatenate) コマンドは複数のファイルの内容を続けて出力します。1つのファイルへのパスを与えた場合もそのファイルの中身を出力するため、専ら比較的短いファイルの内容をディスプレイに出力して確認する際によく使われるコマンドです。

cat file1 [files]
-n#

行番号を表示

4.1.5. tac#

tacコマンドは与えたファイルを行を逆順にして表示します。ソートされたファイルを逆順に表示したり、ログファイルを逆順に確認する際に用いられます。

4.1.7. tail#

tailコマンドは指定された量だけファイルの末端から表示します。オプションを省略した場合は、末尾の10行を表示します。先頭の何行かを除いて表示することもできるため、ヘッダー行の除去等にも用いられます。また、更新中のファイルの内容を表示し続ける際にも使われます。

-n <数字>#

末端からN行表示

-n +<数字>#

先頭のN行を除いた全てを表示

-c <数字>#

行でなくバイト(文字数)でカウント

-f#

ファイルの更新を監視し続ける。対象のファイルが追記されたときにそれを表示する。

4.1.8. wc#

wc(word count) コマンドはファイルの行数や文字数をカウントして表示します。

-l#

行数のみ表示

-m#

文字数のみ表示

-c#

バイト数のみ表示

-w#

単語数のみ表示

4.2. ファイルの比較#

4.2.1. diff#

diffコマンドは2つのファイルを比較して差分を表示します。

diff [options] File1 File2
-i, --ignore-case#

大文字小文字の違いを無視する

-q, --brief#

ファイルが違うかどうかだけを出力する

-w, --ignore-all-space#

スペースを無視して比較する

-y, --side-by-side#

side-by-side形式で表示する

-B, --ignore-blank-lines#

空行を無視して比較する

-W <n>, --width <n>#

side-by-side形式のとき、出力する幅をn文字にする

--left-column#

side-by-side形式のとき、共通する行は左側だけ表示する

--suppress-common-lines#

side-by-side形式のとき、共通する行を表示しない

$ cat a.txt
1
2
3
4
5
6
7
8
9
10
$ cat b.txt
1
2
c
4
5
7
8
10
9
$ diff a.txt b.txt
3c3
< 3
---
> c
6d5
< 6
9d7
< 9
10a9
> 9

デフォルトでは差分のみを独自フォーマットで表示します。例えば3c3は、ファイル1の3行目がファイル2では3行目の内容で変更されていることを示します。

目で見て解釈しやすい形式として、side-by-side形式が用意されています。

$ diff -y a.txt b.txt
1                1
2                2
3              | c
4                4
5                5
6              <
7                7
8                8
9              <
10               10
               > 9

side-by-side形式で表示する場合は、sdiffコマンドが便利です。

4.2.2. sdiff#

sdiffコマンドは2つのファイルを比較して差分を表示します。diffコマンドのside-by-side形式と同じですが、一部のオプションが指定しやすくなっているため、目で見て確認する場合はsdiffコマンドの方が使いやすくなっています。

$ sdiff a.txt b.txt
1                1
2                2
3              | c
4                4
5                5
6              <
7                7
8                8
9              <
10               10
               > 9
$ sdiff -s a.txt b.txt
3              | c
6              <
9              <
               > 9
-l, --left-column#

共通する行は左側だけ表示する

-s, --suppress-common-lines#

共通する行を表示しない

-w <n>, --width <n>#

出力する幅をn文字にする

-i, --ignore-case#

大文字小文字の違いを無視する

-W#

スペースを無視して比較する

-B, --ignore-blank-lines#

空行を無視して比較する

4.3. ファイルの抽出・結合・編集#

4.3.1. grep#

grepコマンドはパターンに一致する行をファイルから検索して表示します。

grep [options] pattern [files...]
-i#

大文字小文字を区別しない

-v#

パターンに一致しない行を表示する

-c#

パターンが含まれる行をカウントして表示

-n#

行番号を追加して表示

-R#

指定されたディレクトリにあるファイルを再帰的に検索

パターンには正規表現が使用できます。

grepコマンドの他にegrepfgrepコマンドがあります。

grepコマンドファミリー#

コマンド

説明

egrep

拡張正規表現が使える(grep -Eと同じ)

fgrep

正規表現に使われる文字もそのまま検索する(grep -Fと同じ)

4.3.2. sed#

sed(stream editor) コマンドはテキストデータの編集を行うコマンドです。様々な機能がありますが、文字列の置換に用いられることが多いです。

sed [-i] [-r] -e 's/regexp/replacement/g' [files...]
-i, --in-place#

編集結果を標準出力に出力せず、指定されたファイルを直接上書きする。

-r#

拡張正規表現を有効にする

regexp#

置換対象の文字列。正規表現が使える。

replacement#

置き換えに使う文字列。正規表現のグループ(括弧内)を``1`` 〜\9で参照することができる。

ヒント

s/regexp/replacement/gの末尾のgは1行中でヒットした全てのパターンを置換することを意味します。gがない場合は、行の中で最初にヒットしたパターンのみを置換します。

ヒント

s/regexp/replacement/gではregexpreplacementを区切る文字として/が使用されていますが、実際には先頭のsの直後の文字が区切り文字として使用されます。例えば、/の代わりに@を使うことで、パスを置換する際の表記が簡単になります。

4.3.3. tr#

tr(translate, transliterate) コマンドは特定の文字(文字列ではない)を置き換えたり削除します。このコマンドはファイルへのパスを引数として取らないため、入出力はリダイレクトパイプと組み合わせて利用します。

tr SET1 SET2
tr -d SET
tr -s SET
tr SET1 SET2

SET1SET2に同じ長さの文字列を指定します。入力に含まれるSET1のn番目の文字を、SET2のn番目の文字で置換します。

tr -d SET

入力からSETに含まれる文字を削除します。

tr -s SET

入力にSETに含まれる文字が連続していた場合、それを1文字に置き換えます。

4.3.4. cut#

cutコマンドはファイルを特定の区切り文字で区切り、指定した列を取り出します。タブ区切りファイルやcsvファイルから特定の列を取り出す際に多用されます。

cut [options] [files...]
-d <区切り文字>#

区切り文字を指定する。省略した場合はタブ文字が区切り文字になる。

-f <列>#

取り出す列を指定する。<列>は下記のフォーマットが使用できる。

n

n列目を表示

-n

先頭からn列目までを表示

n-m

nからm列目を表示

n-

n列目から最後まで表示

n,m,...

n, m, ...列目を表示

-i,j,k-l,m-のような表記も可

-b <列>#

バイトで数えた列を指定する。

-c <列>#

文列で数えた列を指定する。

4.3.5. paste#

pasteコマンドは複数のファイルを横向きに(行ごとに)結合します。デフォルトではタブ文字で結合されます。-dオプションで区切り文字を変更できます。

paste [-d delim] file [files...]

4.3.6. sort#

sortは行の並び替えを行うコマンドです。デフォルトではアルファベットの昇順にソートされます。

sort [options] [files...]
-k#

ソートに使う列を指定する(詳細は下記参照)。指定されなかった場合は、行全体を比較する。

-t <SEP>#

SEPを区切り文字として使用する。省略された場合は最初の空白文字が使われる。

-n#

数値としてソートする。

-r#

逆順(降順)にソートする。

-f#

大文字小文字を区別しない。

-s#

安定ソートを行う。

-kで指定されたデータが同順の時に、行の順番が入力と出力で一致するようにする。

ヒント

-sオプションが指定されていないとき、-kで指定されたデータが同順だった場合は、行全体を比較して順番が決定されます。

警告

文字のソート順はロケールの影響を受けます。

$ cat alphabets.txt
a
b
A
B
$ LC_ALL=en_US.UTF-8 sort alphabets.txt
a
A
b
B
$ LC_ALL=ja_JP.UTF-8 sort alphabets.txt
A
B
a
b

-kオプションではどの列を使いどのように比較するかを指定することができます。フォーマットは-k F[.C][OPTS]もしくは-k F[.C],F[.C][OPTS]のように指定します。

-k オプションのフォーマット#

F

列番号

C

文字位置(C文字目以降/までを比較する)

OPTS

nrなどの並び順に関するショートオプション

$ cat regions.bed
chr1        634     891
chr2        1874    2435
chr2        89      306
$ sort -k 1,1 regions.bed  # 1列目でソート
chr1        634     891
chr2        1874    2435
chr2        89      306
$ sort -k 2,2 regions.bed  # 2列目でソート、ただしデフォルトでは数字もアルファベット順
chr2        1874    2435
chr1        634     891
chr2        89      306
$ sort -n -k 2,2 regions.bed  # 2列目を数値順でソート
$ sort -k 2,2n regions.bed  # 同上
chr2        89      306
chr1        634     891
chr2        1874    2435
$ sort -nr -k 3,3 regions.bed  # 3列目を数値の降順でソート
$ sort -k 2,2nr regions.bed  # 同上
chr2        1874    2435
chr1        634     891
chr2        89      306
$ sort -k1,1 -k2,2n regions.bed  # `-k`は複数指定できる。先に指定したキーが優先される。
chr1        634     891
chr2        89      306
chr2        1874    2435

警告

n列目を指定する場合は、-k nではなく-k n,nと表記するのが正確です。-k nと表記した場合、n列目から行末までが比較対象になります。

たいていの場合、-k n,n-k nは同じ結果になりますが、オプションによっては結果が異なる場合があるため注意が必要です。

$ cat items.tab
1    b    z
2    a    y
3    a    x
$ sort -k 2,2 items.tab  # 2列目でソート。`a`の行は行全体を比較→`2`と`3`が比較される
2    a    y
3    a    x
1    b    z
$ sort -k 2 items.tab  # 2列目以降でソート。`a`の行は`y`と`z`が先に比較される
3    a    x
2    a    y
1    b    z
-c#

ソートをせずに、入力がソートされているかのチェックを行う。

-m#

ソートをせずに、ソートされたファイル同士のマージを行う。

-u#

重複を除外して出力する。

-S <SIZE>, --buffer-size <SIZE>#

バッファとして使うメモリの最大値をSIZEにする。%による割合かKb単位で指定する。バイト単位としてM, G, T...の指定も可。

--parallel <N>#

並行して実行するソート数(CPUの並列数)をNにする。ただし上限は8。

警告

ソート対象のファイルが巨大な場合、sortコマンドは自動でCPUの並列数を増やしたり、メモリのバッファサイズを多く確保する場合があります。これはジョブスクリプト内で巨大なデータをソートする場合に問題になる可能性があります。その場合は、上記のオプションで並列数やバッファサイズを明示的に指定してください。

4.3.7. uniq#

uniqコマンドは入力から連続する同じ内容の行を取り除いて出力します。-cオプションを付与して度数分布表を作成する場合に使われることの多いコマンドです。

uniqコマンドはソートを行わないため、入力中に同じ内容の行が連続せずに含まれている場合は重複を取り除くことができません。そのためsortコマンドと組み合わせて使うことが大半です。

$ cat alphabets.txt
b
a
a
c
a
b
$ uniq alphabets.txt  # 連続した重複は除外されるが、連続していない場合は除去できない
b
a
c
a
b
$ sort alphabets.txt | uniq  # 正しい結果を得るにはソートが必要
a
b
c
$ sort alphabets.txt | uniq -c  # 要素数をカウントする
      3 a
      2 b
      1 c
$ uniq -c alphabets.txt  # `-c`を使う場合もソートが必要なことに注意
      1 b
      2 a
      1 c
      1 a
      1 b

ヒント

sort | uniqsort -uで同じ結果を得ることができます。

4.3.8. join#

joinコマンドは2つのテーブルからキーとなる列を指定して、同じキーの行同士を結合します。

join [options] file1 file2
-1 <FIELD>, -2 <FIELD>#

それぞれ1, 2番目のファイルのFIELD列目をキーとして使う。

-j <FIELD>#

どちらのファイルでもFIELD列目をキーとして使う。

-t <CHAR>#

CHARを区切り文字として使う。

-a <1>, -a <2>#

file1およびfile2の対応できなかった行も出力する。

警告

入力ファイルは結合に用いる列で予めソートされている必要があります。

4.3.9. awk#

awkは正確にはプログラミング言語の1つですが、awkコマンドを使うことでコマンドライン上で簡単なスクリプトを書いて処理を行えるため重宝されています。ここでは紹介にとどめます。

$ cat regions.bed
chr1        634     891
chr2        89      306
chr2        1874    2435
$ awk 'BEGIN{OFS="\t"} {print $1, $2, $3, "Region"NR, $3 - $2, "."}' regions.bed
chr1        634     891     Region1 257     .
chr2        89      306     Region2 217     .
chr2        1874    2435    Region3 561     .