読者です 読者をやめる 読者になる 読者になる

Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Linux便利コマンドの覚書

コマンドラインでいろいろ文字列処理できるよっていうね。

常にpythonperlさん使うより、覚えていたらずっと早かったりする。

そこで、便利だったコマンドを、実際の自分のusageに即してメモする。

というか100本ノックの第二章やってるだけです

 

www.cl.ecei.tohoku.ac.jp

 

cut

デフォルトでは、タブ区切りファイルからコラムを切り出せる。

tsvファイルがあったときに、その第1, 3コラムだけを抽出するには

cat hoge.tsv -f1,3 

結果がほしいときは

cat hoge.tsv -f 1, 3 > output.tsv

とする。

 

区切り文字を変える時には-dをつける

cat hoge.csv -d',' -f2

など

 

sed

文字列変換。

sed -e 's/ABC/DEF/g' hoge.txt > replaced.txt

で、hoge.txt内の"ABC"がすべて"DEF"に置換されてreplaced.txtに出てくる

 

paste

二つのファイルを、同じファイル行数ごとに連結する。

これ、実はすごく強力ではないか?入力ストリームを2つ同時に進めるってのは普通のプログラムだと難しいような気が(少なくとも perlの <>だけではできない?)

paste file1.txt file2.txt > file12.txt #concat with tab (default)

paste -d":" file1.txt fil2.txt > file12-colon.txt # concat with colon. -d to specify the connecting character

paste -d"ABC" fileq.txt file2.txt > file12-A,txt # どうも文字列の最初の1文字しか使わないようだ。この場合は"A"で連結される

 

 sort

入力されたファイルを、ソートして並べ替える。

これまた神コマンドかもしれない。

例えば

高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10

みたいな(タブ区切り)データがあったとき

sort -n -k3 data.txt # 第3列 (-k3)を、数値として(-n)、昇順にソート

大阪府 豊中 39.9 1994-08-08
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
山形県 酒田 40.1 1978-08-03

sort -n -k3 -r data.txt # -rで降順になる

山形県 酒田 40.1 1978-08-03
群馬県 前橋 40 2001-07-24
岐阜県 美濃 40 2007-08-16
大阪府 豊中 39.9 1994-08-08

 これは圧倒的便利

 

cat

cat自体はまあ普通だけど、頭のよい使い方を

cat コマンド | コマンドの使い方(Linux) | hydroculのメモ

で見かけたので下記に引用する。

 

行数が膨大なテキストファイルに対してなにかの処理をしたい。

処理に時間がかかってしまうが、その “なにか” を処理させるワンライナーが正しいかどうか不安で何度か試行錯誤する必要がある場合に、試行錯誤中は、テキストファイル全体を処理するのではなく、headでファイルの一部だけを処理してみる。

ワンライナーが完成したときに、コマンド履歴の headcat に書き換えるだけで処理を完成させることができる。

“なにか” が仮に文字コード変換だとすると、こんな感じ。

## テキストファイルの文字コードがわからないが、とにかくUTF-8にしたい
$ head huge.txt | nkf --guess
CP932 (CRLF)

## CP932 というのをUTF-8にするにはどうしたらいいんだっけ?
$ head huge.txt | nkf -sW
...

## 違った、文字化けしちまった、こっちかな?
$ head huge.txt | nkf -Sw
...

## 合ってた。さて、改行コードはどうなってる?
$ head huge.txt | nkf -Sw | nkf --guess
UTF-8 (CRLF)

## 改行コードも直したい
$ head huge.txt | nkf -Sw -Lu | nkf --guess
UTF-8 (LF)

## OK。じゃあ、本番
$ cat huge.txt | nkf -Sw -Lu > result.txt

最後の本番のコマンドは nkf -Sw -Lu huge.txt > result.txt でもよいのだが、直前のコマンド履歴のheadcat に書き換えるだけのほうが、タイピングが楽で間違えないのである。このとき cat はほとんど意味のある仕事をしないが、タイピングを楽にすることに意味がある。