テキスト操作

Ippei Kishida

Last-modified:2016/04/26 23:38:21.

『UNIX今日の技』で記事にしたコマンドのうち、テキスト操作に関連するコマンドを纏めたものです。

1 改行文字の変更(dos2unix, unix2dos)

Windows で編集したファイルを UNIX で使おうとすると改行文字が悪さをする事があります。 Linux では unix2dos, dos2unix というコマンドが用意されていて、これを使うと改行文字の変更ができます。 (他の UNIX では別の手段を講じる必要がありますが、それについては省略します)。

2 diff

「2つのテキストファイルに違いがあるのか、違いがあるならばその差分はどこか」、 diff はそういった要望に適切に応えます。 例えば、比較計算の2つの POSCAR ファイルでどの原子の座標をいじったのか分からなくなった場合、「diff calcA/POSCAR calcB/POSCAR」とすれば、違いがあればその差分が表示されます。 ファイルの内容が同一ならば、何も表示しないまま diff は終了します。

3 行数や単語数を数える(wc)

wc は Word Count の略で、行数や単語数を数えるのに使います。 「ls | wc」とすればカレントディレクトリのファイル数を数えることができます」

他にも例えば、 VASP の Selective Dynamics で構造緩和させる原子の数を数えたい場合。 「grep ‘T T T’ POSCAR」とでもすれば緩和するよう指定した原子のみを抽出(表示)することができるので、それをパイプで wc に渡します。 「grep ‘T T T’ POSCAR | wc」すると、結果として「行数, 単語数, 文字数」が表示されます。 POSCAR ファイルは一行が一原子に対応してますので、行数が原子数ということになります。 さらに「Li についてだけ数えたい」場合は、「grep ‘T T T’ POSCAR | grep Li | wc」で OK です。

wc は普通にファイルを指定して「wc file」とすれば、file という名前のファイルの「行数, 単語数, 文字数」をカウントします。 英語で abstruct を書く場合なんかには便利だと思います。

4 less / more

テキストファイルを読むためのプログラム(ページャ)ですが、これは複数のファイルを扱えます。 例えば、less */CONTCAR として起動し、「:n」「:p」で前後のファイルに移動できます。

ページ内検索は「/文字列」です。 以降、「n」で正順、「N」で逆順に検索して行きます。 最後に検索したワードは一回の less プロセスで(則ち「:n」「:p」で移動している間は) 保存されます。

また、「v」で vi (環境変数 $EDITOR で指定したエディタ)での編集モードへ移行します。

5 grep

grep string file [files...]

file という名前のファイルの中のある文字列’string’ を含む行を抽出します。 file には複数のファイルを指定することもできます。 例えば、’grep NELECT */INCAR’ とすれば全ての計算ディレクトリにおける電子数の設定を確認することができます。

また、‘ps auxw | grep vasp’ のように標準出力から抽出するのにも便利です。 -v オプションを付けると「文字列を含まない行」を抽出しますので、‘ps auxw | grep vasp | grep -v grep’ とすると ‘grep vasp’ というプロセスを表示しないようにすることもできます。

6 head

ファイルの先頭を表示します。 オプション「-n」で表示する行数を制御できます (指定しなければ10行)。

head -n 3 POSCAR
head -3 POSCAR

どちらでも同じです。 ワイルドカードで複数ファイル指定すると結構便利です。

7 tail

tail コマンドはファイルの末尾(デフォルトでは10行)を表示します。 ’tail */OUTCAR’ とすれば計算が異常終了していないかどうか確認できるでしょう。

8 ファイルの n 行目を取出す

8.1 確実だけど一つのファイルからしか取れない方法

head -n 10 foo.txt | tail -n 1

8.2 不確実だけど複数のファイルから取れる方法

cat -n *.txt | grep '^    10'
(grep 引数の '^' は行頭を表す正規表現)

9 sort

ソート(並べ変え)を行うフィルタです。 引数でファイルを指定すればファイルの内容をソートしますが、標準入力を処理する方が多いと思います。

とはいえ私もコマンドラインから直接使うことは滅多になくて、エイリアスや関数で定義して暗黙に使う事が殆どです。 例えば、以下のように pst, psm という関数を私は定義しています。

pst () {
        ps auxw | head -n 1
        ps auxw | sort -r -n +2 | grep -v "ps -auxww" | grep -v grep | head -n 8
}
psm () {
        ps auxw | head -n 1
        ps auxw | sort -r -n +3 | grep -v "ps -auxww" | grep -v grep | head -n 8
}

sort のオプション解説 * -r 「逆順(大→小)でソート」 * -n 「(文字列ではなく)数値としてソート」(10.0と9.0の比較で10.0の方が大きいと認識させる) * +2 「行中の2番目の要素についてソート」