Linux便利コマンドの覚書
コマンドラインでいろいろ文字列処理できるよっていうね。
常にpythonやperlさん使うより、覚えていたらずっと早かったりする。
そこで、便利だったコマンドを、実際の自分のusageに即してメモする。
というか100本ノックの第二章やってるだけです
cut
デフォルトでは、タブ区切りファイルからコラムを切り出せる。
tsvファイルがあったときに、その第1, 3コラムだけを抽出するには
cat hoge.tsv -f1,3
結果がほしいときは
cat hoge.tsv -f 1, 3 > output.tsv
とする。
区切り文字を変える時には-dをつける
など
sed
文字列変換。
で、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-03sort -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
でファイルの一部だけを処理してみる。ワンライナーが完成したときに、コマンド履歴の
head
をcat
に書き換えるだけで処理を完成させることができる。“なにか” が仮に文字コード変換だとすると、こんな感じ。
## テキストファイルの文字コードがわからないが、とにかく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
でもよいのだが、直前のコマンド履歴のhead
をcat
に書き換えるだけのほうが、タイピングが楽で間違えないのである。このときcat
はほとんど意味のある仕事をしないが、タイピングを楽にすることに意味がある。