設問3:UNIXのパイプ機能を使って1行コマンド処理をしてみよう!

CodeIQに投稿した設問3の解答を説明します。

問題

データをゲノムデータベースサイトGenBankからダウンロードし、解凍します。使用するのはnames.dmpのみです。

ftp://ftp.ncbi.nih.gov/pub/taxonomy/taxdump.tar.gz

names.dmpは、生物種のデータです。

タブも含まれていますが、’|’での区切りデータとしてください。

各フィールドの説明は以下の通り。

1. 生物種ID

2. 生物種名

3. ユニークな生物種名

4. 同義語等

UNIXにはパイプ機能がありますので、キーワード検索を行い、ソートして確認するコマンドを1行で書いてください。

1. まず、大文字・小文字の区別なく’virus’という文字列を含む行を取り出します。Virus, VIRUSも含まれます。

2. 第2フィールドの生物種名のアルファベット順(昇順)でソートします。

3. 生物種名には時々、ダブルクウォーテションや大文字・小文字が混在していますが、特殊記号は無視して、大文字・小文字の区別なくソートします。

解答するもの

1. 上記の様に抽出・ソートするための1行コマンド。目で確認する為、最後にless-Sを付けてください。

2. 1の内容の行数を計算する1行コマンド。

完成したUNIXコマンドはテキストファイルに変換し、下のファイルアップロードから提出してください。

解答例

1.

$ grep -i virus names.dmp|sort -k 2 -t "|" -f -d | less -S

セパレータの設定 -t “|” は無くても結果は同じです。

2.

ソートは要らないので、

$ grep -i virus names.dmp | wc -l
111548

※ grep -i virus names.dmp | wc -l の結果の値はデータが定期的に更新されているので、結果が異なります。

広告

「設問3:UNIXのパイプ機能を使って1行コマンド処理をしてみよう!」への1件のフィードバック

  1. フィードバックありがとうございました。1問目の sort -f や2問目の sort 不要はまったく見落としていました。。勉強になります。シンプルなコマンドで大規模なテキストをわりと実用的な時間で処理してくれるので便利ですね。grep の挙動違いは初めて知りました。。ちょっとびっくりです。未確認ですが Windows 上 cygwin の grep でも違うのかも。。ちなみに先ほど(3/26 23:20)ftpサイトからダウンロードし直したデータでは$ grep -i virus names.dmp | wc -l 111757でした。データが更新された?のかもしれません。一応ご参考まで↓$ bash –versionGNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)Copyright (C) 2007 Free Software Foundation, Inc.$ grep –versiongrep (BSD grep) 2.5.1-FreeBSD$ sort –versionsort (GNU coreutils) 5.93Copyright (C) 2005 Free Software Foundation, Inc.This is free software. You may redistribute copies of it under the terms ofthe GNU General Public License <http://www.gnu.org/licenses/gpl.html&gt;.There is NO WARRANTY, to the extent permitted by law.Written by Mike Haertel and Paul Eggert.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中