設問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 の結果の値はデータが定期的に更新されているので、結果が異なります。