計算科学に必要なShellによるテキストファイル編集

2018/05/18 追記
2019/12/06 追記

どうやらmac上で、sed がうまく動かないという問題があるようです。
なんで僕のは動いていたんだろうか。。どこかで対処してたのかな。

解決法は以下を参照
https://it-ojisan.tokyo/2018/01/22/mac-linux-sed/
https://qiita.com/catfist/items/1156ae0c7875f61417ee

余分なスペースだらけのテキストファイルの表を、表計算ソフトに移植したい時ありませんか。
私は、単結晶X線構造解析や、計算で出した最適化構造の座標ファイルを扱う時に、余分なスペースに困らされることが、よくあります。

これまで私は、1.テキストをワードで開き、2.検索と置換機能を使って連続するスペースをまとめる、という作業をチマチマ行って、テキストファイルを再編集していました(下図)。



元のテキストファイル
これを表計算ソフトに入れると…
スペースの所でグチャグチャに。


手でやるよりは断然効率がよいものの、もっと良い方法があるはず、、と悶々とする日々。

最近、shellがすこし使えるようになってきたので、sedコマンドでかんたんにファイルを整形できるようになったので備忘録です。(Macですが、他のOSでもちょっと調べればできるはず。)

______________________

1. ターミナルを起動し、対象ファイルのあるところまで移動。(ここがわからなければ、ターミナルコマンドのcdコマンドについて検索)
2. ターミナル上で以下を打ち込む。
sed -r 's/ +/ /g' "ファイル名"

例:デスクトップ上においてある、"abc.txt"とよばれるファイルの空白を飛ばす
$ cd Desktop
$ sed -r 's/ +/ /g' abc.txt

これで、ターミナル上に2つ以上のスペースが一つにまとめられた出力が出てくるはずです。.txt などの拡張子は必ず入れましょう。
's/ +/ /g'というところは、正規表現です。
's/A/B/g'であれば、テキストファイルの中にあるAをすべてBに書き換えろ、という指示になります。
" +/" (スペース注意)は、一つ以上のスペース、という意味です。
つまり、コマンドとしては一つ以上のスペースを、一つのスペースに置き換えろ、という支持になります。
(これは、拡張正規表現の記法なので、sed の後に、拡張正規表現を用いることを宣言するオプションコマンド、"-r"が必要に。)

これをabc2.txtという名前にしたければ、

sed -r 's/ +/ /g' abc.txt > abc2.txt

直接 text1.txt に上書きしたければ、
sed -r -i 's/ +/ /g' abc.txt 

追記。バックアップファイルとして、abc.txt.bak という名前のファイルを残しながら変換する方法(失敗した場合も考えると、一番効率が良いと思う。)

sed -i “.bak” -E “s/ +/,/g” abc.txt

-i の後ろのダブルクオーテーション("")で、架空の拡張子をオリジナルファイルに付けたものを同時生成させられる。(バックアップ重要!)

-E は、-r と同様、正規表現(たとえばここでは、連続するスペースを意味する「 +」)を利用したい場合につかうコマンド。

ちなみに、「sed -i」のように検索すると、検索エンジンに、「i」 を含む結果を排除して表示されてしまうので、オプションコマンドについてもっと調べたかったら、「sed オプション i」のように検索してね。
______________________

複数ファイルのスペースを一括で飛ばす方法についてはまた今度。
(まだできない!)

コメント

このブログの人気の投稿

VNCで見ている画面と自分のマシンの間でのコピー&ペースト

Natural Bond Orbital (NBO) Analysis, 自然軌道解析をやってみる

Lanl2DZの使い方