警告
本資料は参考情報として提供されています。内容についてのご質問には必ずしもお答えできない可能性がございます。
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 |
|
矢印キー |
上下左右にスクロール |
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 |
前のマッチしたパターンに移動 |
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.6. head#
head
コマンドは指定された量だけファイルの先頭から表示します。オプションを省略した場合は、先頭の10行を表示します。
- -n <数字>, -<数字>#
先頭からN行表示
- -n -<数字>#
末尾のN行を除いた全てを表示
- -c <数字>#
行でなくバイト(文字数)でカウント
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
コマンドの他にegrep
とfgrep
コマンドがあります。
コマンド |
説明 |
|
拡張正規表現が使える( |
|
正規表現に使われる文字もそのまま検索する( |
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
ではregexp
とreplacement
を区切る文字として/
が使用されていますが、実際には先頭のs
の直後の文字が区切り文字として使用されます。例えば、/
の代わりに@
を使うことで、パスを置換する際の表記が簡単になります。
4.3.3. tr#
tr
(translate, transliterate) コマンドは特定の文字(文字列ではない)を置き換えたり削除します。このコマンドはファイルへのパスを引数として取らないため、入出力はリダイレクトやパイプと組み合わせて利用します。
tr SET1 SET2
tr -d SET
tr -s SET
tr SET1 SET2
SET1
とSET2
に同じ長さの文字列を指定します。入力に含まれる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]
のように指定します。
|
列番号 |
|
文字位置(C文字目以降/までを比較する) |
|
|
$ 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 | uniq
はsort -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 .