標準サーバーコマンドオタクの、ユゲタです。
サーバーにおける標準のコマンドというのは、どのサーバーでも、インストールせずに問題なく使えるコマンドということで、
webサービスの機能として利用するにはもってこいという事になります。
ボクの場合、SQLを運用するよりも、awkなどのサーバー機器のIOに対しての高速処理ができるコマンドを利用して、
独自データベースを作って運用しているんですが、運用も管理も構築も全てが効率的で、そのため、標準コマンド様々と感じています。
cutコマンドについて
そんなよく使うコマンドの中で、cutコマンドというのがあるので、今回はこのcutコマンドを知らない人に向けて
色々と便利ポイントや技的な事をお伝えしておきます。
まず、このcutコマンドはどういう機能なのかと言うと、
テキストファイルの文字列を部分的に切り抜いて出力してくれるという機能です。
パソコン覚えたての時に、狂ったようにやってしまう、「カットアンドベースと」のカットと同じ感じですね。
そして、このコマンドが便利に使えるポイントは、csvファイルのような、一定のフォーマットにおけるファイルの一部分の列だけを抜き出したい時などに使うと便利です。
エクセルで作った表をcsvで出力して、C列だけを抜き出したい時には、次のように実行するといいでしょう。
※ちなみに、csvファイルは、「,(カンマ)」区切りのファイルを想定しています。
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
cut -d ',' -f 3 data.csv
> ccc
> fff
> iii
こんな感じで、列の抜き出しができます。
cutコマンドを解説すると、
cut -d 'デリミタ(区切り文字)' -f (列の番号※1start)(ファイル名)
ちなみに、ファイル名は、複数記述しても、全てが対象になるので、ありがたいです。
デリミタとは?
デリミタ(区切り文字)って、そのままなんですが、データファイルの仕様によって、ここが
カンマであったり、タブであったり、スペースであったり、
いろいろな区切り文字があります。
どんなデリミタでも、対応できるためのオプションなので、便利に使えるイメージができると、テキストデータに対して怖いものなしになります。
不具合につながる、都合の悪い事
便利そうに思えるこのcutコマンドですが、都合の悪いときもたまにあります。
そうした事も理解しておいてお使いください。
まず、値の中にデリミタ文字が入ってしまっているケースや、切り抜く列の数が一定でない場合などは、
結果が思ったとおりにならないと思います。
例えば次のようなデータの場合。
111,222,333,444,555
aaa,bbb,ccc
AAA,BBB,CCC,DDD
このデータで、各行の3列目以降のデータを取得したい場合は、次のようにします。
# 通常
$ cut -d ',' -f 3 data2.csv
> 333
> ccc
> CCC
# 任意列以降のデータ習得
$ cut -d ',' -f 3- data2.csv
> 333,444,555
> ccc
> CCC,DDD
こんな感じで、-fオプションの数値の後ろに-(ハイフン)を付けるだけで、それ以降という扱いになります。
ちなみに、3-4とすると、3列と4列が出力されます。
あと、個人的に駄目だと感じているのは、エクセルで出力したファイルで、"(クォーテーション)で値が囲まれていて、その中にデリミタ文字列が入り込んでいる場合、
これには対応することができないので、別方法での取得をしなければいけません。
あと、値に改行が入っていしまうと、行の概念が壊れてしまうので、これも対応不可です。
シンプルなcsvファイルに対して使えるコマンドという認識でいればいいかと思っていますね。
応用編
ではこのcutコマンドをいったいどういう使い方をすればいいかというと、任意のファイル一覧を取得して、それをsumコマンドでチェックサムを取得したり、容量や、ファイルのタイムスタンプを取得するような使い方で、
そのデータをさらに、システムで利用できるようになります。
$ find . -type f | xargs sum
> 64857 1 ./data2.csv
> 32005 1 ./data.csv
今回作成したcsvデータが入ったフォルダで、実行してみましたが、ログデータなどに対してもこれで便利に管理できるイメージができます。
findコマンドとxargsを組み合わせてパイプでつなぐと、こんなこともできてしまいます。
無意味にブラックボックスのSQLを使って、トラブルに陥ってしまうよりも健全ですよ。
あくまで、ユゲタの持論ですが・・・
0 件のコメント:
コメントを投稿