[ quoted from ] 情報演習 課題U-B-1(※)一部抜粋・改変

ダウンロードしたCSVデータはアメリカ合衆国の州毎の人口統計データを表しているのだが、このデータから各州の名前のみを抜き出し、これらをアルファベット順に1行にひとつずつ並べたファイルUSstates.csvを作成するには Linuxのコマンドをどのように組み合わせればよいか。

まずはヒントにあるようにsort,cutコマンドについて調べてみてください。コマンドについて調べるためにわざわざググる必要はありません。コマンドについて分からないことがあったときは、コマンドのmanualを表示するコマンドmanを使って調べる習慣をつけましょう。

なお、manコマンドで表示したmanualから脱出するにはqをタイプします。ここまでの内容は全て教科書に載っているので、一通り関連するページを読んでおくことをオススメします。

GNOME端末での入出力例
コマンド1 入力 man sort
出力
  • SORT(1)
  • SORT(1)
名前
sort - テキストファイルをソートする
書式
sort [-cm] [-bdfginruzM] [+POS1[-POS2] [-o OUTFILE] [-t SEPARATOR]
(中略)
説明
sort は与えられた各 FILE をソート・マージ・比較する。結果は結合されて 標準出力に書き出される。
(後略)
脱出 q
コマンド2 入力 man cut
出力
  • CUT(1)
  • CUT(1)
名前
cut - 各行から選択した部分を表示する
書式
cut [-ns] [-b BYTE-LIST] [-c CHARACTER-LIST] [-d DELIM] [-f FIELD-LIST]
(中略)
説明
cut は、与えられた FILE それぞれから、各行の一部を選択して標準出力に書 き出す。 FILE が一つも与えられないと標準入力から読み込む。
(後略)
脱出 q

manualを読めば、sortコマンドによりデータをアルファベット順に並べられることが分かります。ひとまず、分かった時点でまず試してみましょう。試さないと何事も進みません。

GNOME端末での入出力例
コマンド3 入力 sort statepop.csv
出力 "Alabama",4447351,4557808,2.5
"Alaska",626931,663661,5.9

(後略)

このように、第一列のデータのアルファベット順でソートされていることが分かります。(もちろん、第何列かというのは重要ではなくて、1文字目がどの行もダブルクォーテーションなので実質上第1列の文字列でソートされているのです。)

cutコマンドはデータの各行から指定した部分だけを切り出してきて出力します。manualを読んだだけでは分かりにくいかもしれませんが、例えばテキストファイルの各行の頭1文字を抜き出して出力する、といったことができます。

ここで、statepop.csvがどういうファイルだったか確認しておくと、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 入力待ち