[ quoted from ] 情報演習 課題U-B-1(※)一部抜粋・改変
ダウンロードしたCSVデータはアメリカ合衆国の州毎の人口統計データを表しているのだが、このデータから各州の名前のみを抜き出し、これらをアルファベット順に1行にひとつずつ並べたファイルUSstates.csvを作成するには Linuxのコマンドをどのように組み合わせればよいか。
[ quoted from ] 情報演習 課題U-B-1(※)一部抜粋・改変
ダウンロードしたCSVデータはアメリカ合衆国の州毎の人口統計データを表しているのだが、このデータから各州の名前のみを抜き出し、これらをアルファベット順に1行にひとつずつ並べたファイルUSstates.csvを作成するには Linuxのコマンドをどのように組み合わせればよいか。
まずはヒントにあるようにsort
,cut
コマンドについて調べてみてください。コマンドについて調べるためにわざわざググる必要はありません。コマンドについて分からないことがあったときは、コマンドのmanualを表示するコマンドman
を使って調べる習慣をつけましょう。
なお、man
コマンドで表示したmanualから脱出するにはqをタイプします。ここまでの内容は全て教科書に載っているので、一通り関連するページを読んでおくことをオススメします。
コマンド1 | 入力 | man sort |
---|---|---|
出力 |
|
|
脱出 | q | |
コマンド2 | 入力 | man cut |
出力 |
|
|
脱出 | q |
manualを読めば、sort
コマンドによりデータをアルファベット順に
並べられることが分かります。ひとまず、分かった時点でまず試してみましょう。試さないと何事も進みません。
コマンド3 | 入力 | sort statepop.csv |
---|---|---|
出力 |
"Alabama",4447351,4557808,2.5 "Alaska",626931,663661,5.9 : (後略) |
このように、第一列のデータのアルファベット順でソートされていることが分かります。(もちろん、第何列かというのは重要ではなくて、1文字目がどの行もダブルクォーテーションなので実質上第1列の文字列でソートされているのです。)
cutコマンドはデータの各行から指定した部分だけを切り出してきて出力します。manualを読んだだけでは分かりにくいかもしれませんが、例えばテキストファイルの各行の頭1文字を抜き出して出力する、といったことができます。
ここで、statepop.csvがどういうファイルだったか確認しておくと、CSV形式のデータはカンマで区切られたデータの集まりである
と書いてあります。
行\列 | 州 | 人口 | … |
---|---|---|---|
第1行 | Delaware | 783600 | … |
第2行 | District of Columbia | 572059 | … |
… | … | … | … |
↑
上のデータ集合(表)と下のテキスト表現(CSV形式)は一対一に対応している。
↓
Delaware,783600,843524,7.6 District of Columbia,572059,550521,-3.8 Alaska,626931,663661,5.9 …
一方、manualを読んでみると-d
オプションの項目に区切り文字のことが以下のように書いてあります。
[ quoted from ] cutのmanual
-d DELIM, delimiter=DELIM
- -f と一緒に用いると、フィールドの区切り文字として DELIM の先 頭 の文字を使う (デフォルトは <TAB>)。
-f FIELD-LIST, --fields=FIELD-LIST
- FIELD-LIST にリストされた各フィールドだけを表示する。フィールド の区切りはデフォルトでは <TAB> である。
慣れないうちは
だけを見ても何のことかさっぱりかもしれません。これはオプションの書き方を説明していて、-d DELIM, delimiter=DELIM
-d 〜
もしくはdelimiter=〜
と書くことで〜を区切り文字(DELIM)にするという意味です。
同様に、
というのは、-f FIELD-LIST, --fields=FIELD-LIST
-f 〜
もしくはfields=〜
と書くことで第〜フィールド(FIELD−LIST)の部分を出力するという意味になります。
ここで、CSV形式のデータの区切り文字はもちろんカンマで、結果として欲しいデータは第1列の州名データです。つまり、上記のオプションでそのようにcut
の方法を指定すればよいのです。自分で試してみてください。
ところで、今までGNOME端末上に打ち込んだコマンドの実行結果は、GNOME端末上に表示されていますが、結果を端末以外に出力することもできます。パイプという便利なシステムもあるのですが、ここではファイルへの出力だけ簡単に解説します。
コマンドの実行結果を直接他のプログラムに渡すのがパイプです。課題U-B-2の場合、パイプも使うと入力コードが短くて済む(1行!)のですが、ファイルへの出力だけでも課題はクリアできます。
コマンドの後に> OUTPUT
を付け足すことで、コマンドの出力先ファイルをOUTPUTにすることができます。以下にlsコマンドの出力結果をoutput.txtに保存する例を示します。出力先ファイルを指定したので、端末上に結果が表示されずすぐに次のコマンド入力待ち状態になります。実際にoutput.txtに結果が出力されることを確かめてみてください。
コマンド4 | 入力 | ls ./ > output.txt |
---|---|---|
コマンド5 | 入力待ち |