[Linux]awkの使い方① awkって何~?


はじめに

awkはLinuxの端末で、データベースなんかをちょっと成形したりするときによく使うので、自分の勉強も兼ねて記事を書こうと思いました。

そもそもawkとは

そもそもawkって何なんだろうと、よくもわからずコマンドを使っていましたので、少しググってみました。
以下引用です。

awk(オーク)コマンドとは?
 「awk」は空白などで区切られたテキストを処理するコマンドです。演算機能もあり、プログラミング言語としても使用されています。
 Linux環境で使用されているのは、GNUプロジェクトによる「gawk」コマンドが多く、例えばCentOS 7の場合、awkは/usr/bin/gawkへのシンボリックリンクとなっています。

以下、引用元

インフォマティクス超初心者の私にはわからなかった単語

  • GNUプロジェクト
  • gawk
  • /usr/bin/gawk
  • シンボリックリンク

*一つ調べると、こんな感じで分かんないことだらけで理解するのにめっちゃ時間がかかってしまい、途中で挫折するのがオチなのです。

GNUプロジェクト

巷でよく聞く「グニュー」というやつか、と思いググってみると以下のような感じ。

GNUとは、フリーソフトウェア(特に、オープンソースソフトウェア)のみでUNIX風のOSと関連するソフトウェア群を開発・公開するプロジェクト。リチャード・ストールマン(Richard M. Stallman)氏が創始し、同氏が代表を務めるフリーソフトウェア財団(FSF:Free Software Foundation)が推進している。

5割くらいしか理解できていないが、要するにフリーなソフトを出してくれている人たちと理解しました。

gawk

awkに何やらgがついているが、一応調べてみると以下の記載があったので、とりあえずawkと同じだと理解。

awkがオリジナルのもので、gawkがGNU 独自の拡張を行ったもの
gawkがインストールされていればgawkを使っていれば問題ない

/usr/bin/gawkとシンボリックリンク

/usr/bin/gawkと書いてあったので、実際に自分の環境内のこのパスのファイルを見てみる。
すると確かに、/usr/bin/のフォルダ内にgawkのファイルを発見!!

そしてシンボリックリンクというのは、要するにショートカットだと思えばいいです。/usr/bin/gawkのファイルにawkという名前のショートカットを作成して、実行しているような感じだと理解しました!

どんなことができるのか

私の場合は、100万行くらいあるデータベースを、条件にあう行とか必要な列だけを取ってきたり、各行の1列目に同じ文字を付与したりとか。簡単にできちゃうのでお勧めです。

具体例(少し私の専門的な話になるので読みたい人だけ)

私の場合以下のようなデータをよく扱うので、こちらを参考に少し説明。

【具体例】

sample.vcf
20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4
20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2

上記のファイルはvcfっていうフォーマットで記述されていて、要するに遺伝子変異の情報を1行1行記述しているものです。
それぞれの列の意味は以下のような感じ。
 1列目の20:染色体20番という意味
 2列目の14370:端から数えた時の染色体上の位置(14370番目の塩基)
 3列目はIDなので無視
 4列目のG:リファレンスとなっている配列の染色体20番14370番目の塩基
 5列目のA:染色体20番14370番目の塩基がどの塩基に変異しているか
 それ以降の列はこの変異に関数る色んな情報が載ってるだけなので無視

上記のファイルを扱うときに、無駄な情報が多くて見にくいので、1~5列目だけに絞ったりとか、1列目にchr(染色体って意味)ってついてないとソフトが読み込まなかったりとか、色々不都合があるので、awkで以下のように成形できます。

awkコマンド
awk '{print "chr"$1,$2,$3,$4,$5}' sample.vcf
出力結果
chr20 14370 rs6054257 G A
chr20 17330 . T A
chr20 1110696 rs6040355 A G,T
chr20 1230237 . T .

今回の場合は4行しかないので正直手作業とかエクセルの方が速いですが、実際は100万行くらいにあるので、そんなときに非常に便利です。

次回

次回からawkの使い方について、基礎的なところから少しずつ紹介していけたらと思います。