情報 UNIX コマンド演習

目的: 今週の目標は、以下のことを学ぶことです。

パイプとリダイレクション
テキスト操作のためのいくつかのコマンド(cat,sort,uniq,cut,wc,paste,head)
単純なコマンドをパイプで組み合わせて複雑な処理をする方法

講義と演習

パイプとリダイレクションについて講義し、簡単なコマンドを組み合わせて複雑な 処理をする方法について述べる。その後、UNIXシステムで一般的なテキスト処理の コマンドを説明し、以下の演習課題でそれらのコマンドを組み合わせる練習を行う。 パイプとリダイレクションの簡単な説明はここをクリック。 演習で使用する テキスト処理コマンドの簡単な解説は このページの最後。

ターミナルの設定

    まず、ターミナルを立ち上げる。ターミナル-->環境設定-->詳細-->言語環境--->文字エンコーディング-->日本語(EUC) に設定。設定した後に、新たにターミナルを立ち上げる

    

演習課題

課題6−1(試しにやって見よう(解答付き))
(1) 以下のディレクトリ以下のファイルを各人コピーする。

  /home/3989646672/kadai5data

 上記のディレクトリ以下すべてを、今いるカレント・ディレクトリに コピーする方法は以下。

  % cp -r /home/3989646672/kadai5data .  (最後のドットに注意)

ファイルの説明:

 郵便番号が7桁になってから、大口の組織にはユニークに定まる郵便番号が 割り当てられるようになった。これは、申請があると割り当てられたり、廃止 されるので、逐次更新されている。kadai5dataの下には最近追加された大口 組織の郵便番号を調べたデータが3つ入っている。これは、3人の学生に調査を 依頼したために3つになった。しかし、3人の学生が調べた期間は微妙に重複を 含むので、まったく同じデータが一部重複して入っている可能性がある。 (重複しているデータは1行全く同じと考えてよい)

                  kadai5data/com1.txt
                  kadai5data/com2.txt
                  kadai5data/com3.txt
                
各データのフォーマットは同一で、1行に1組織のデータが入っている。各行の のデータは以下の順序で入っている。各項目の区切りはタブである。

   組織の読み 組織名 都道府県名 市名 新郵便番号 旧郵便番号

例えば、以下のようなデータが入っている。

             コパルデンシ    コパル電子      埼玉県  入間市  3588765 358
             ス-パ-バツグ    スーパーバック  埼玉県  入間市  3588710 358
             カミフクオカシヤクシヨ  上福岡市役所    埼玉県  上福岡市        3568501 356
             シンニホンムセン        新日本無線      埼玉県  上福岡市        5368510 356
                
以下のコマンドで、これらのファイルを眺めてみよ。

  % cat com1.txt

(2) com1.txtのデータを、組織の読みで「あいうえお」順にソートしたファイルを作る。

  解答例1: ソートしたファイルを見るだけ

% export LC_ALL=C

       % sort < com1.txt | more  (または % sort com1.txt | more)

注意:export LC_ALL=Cを行うと、ファイルを見るときに文字化けする。もう一つ別にターミナル画面を立ち上げてファイルを見てください。それか、export LC_ALL=Cを行わず、sortコマンドを使うとき、先頭につけて、 LC_ALL=C sort  とします。日本語のソートにLC_ALL=Cが必要になります。

LC_ALLは環境変数、詳しく知りたい人はここをクリック。

解答例2: ソートしたファイル(com1.sort)を作る

       % sort < com1.txt > com1.sort (または % sort com1.txt > com1.sort)

       (com1.sortを上から順番に見ていく==> % more com1.sort)

(3) com1.txtに関して、組織の読みでソートされた、組織名(かな漢字混じり)だけ の一覧を出力する。

    解答例: % sort < com1.txt | cut -f2 | more

(4) 3人の調査結果をあわせて、重複を取り除いたデータを見る。

    解答例1: % cat com1.txt com2.txt com3.txt | sort | uniq | more

    解答例2: % sort com1.txt com2.txt com3.txt | uniq | more

(4) 3人の調査結果で重複していたデータを見る。

    解答例: % cat com1.txt com2.txt com3.txt | sort | uniq -d | more

では、以下の課題を自分の力で解いて下さい。コマンド解説にあるコマンドと パイプ、リダイレクションのみで処理すること(perlやawkを知っていても 使用しないこと)。

課題6−2
3人のデータを合わせて重複を取り除いたデータに対して、組織の読みで ソートされた組織名(かな漢字混じり)だけの一覧ファイルを 作成せよ。

結果の例:

                あいう商会
                いうえ商会
                かきく社
                ・・・
課題6−3
3人のデータを合わせて重複を取り除いたデータが合計何件あるかを調べよ。
課題6−4
3人のデータを合わせて重複を取り除いたデータを新郵便番号でソートし、 新郵便番号と会社名のペアを出力せよ。各行の順序は郵便番号、会社名と なっていること。新郵便番号は文字としてソートすること。この課題は たぶん、1行のコマンドではできない。(1行でできた人は私(蔡)に 教えて下さい。)

結果の例:

                1056666 あいう商会
                1057777 かかか会社
                ・・・
課題6−5
3人のデータを合わせて重複を取り除いたデータに関して、 各都道府県ごとの組織の数の一覧ファイルを作成せよ。

結果の例:

                5 熊本県
                8 鹿児島県
                ・・・
              
課題6−6
課題6−2、6−4、6−5で作成したファイルの上5行のみを取り込んだ ファイルを作成せよ。(ヒント:headコマンド)

報告

 課題6−6で作成したファイルに以下の情報をmiで付け加え、ICT-LMSにアップロードする。miで読めないとき(反応が遅いことがあります)はテキストエディットを使ってください。

           (1) 「コンピュータリテラシ課題6報告書」、所属、学籍番号、名前、日付
             (ファイルの一番上)
           (2) 各5行のデータに課題番号が分かるように課題番号を付け加える。
           (3) 各5行のデータをどのように作成したかを、打ち込んだコマンドを書け。
            (4) 課題6−3で打ち込んだコマンドと、その結果(件数)を課題6−3の
        解と分かるように書け。
        
レポート例:

  

                情報 課題6 UNIX シェル コマンド 報告書
        
                gXXXXXX、情報太郎
                  日付
        
          課題6−2: % xxxx | yyy | zzz > xyz.xxx
             あいう商会
                いうえ商会
                かきく会社
                ・・・
              
            課題6−3: % xx yy zz | xx2 | zzyy
      32件
            
            課題6−4: % yyz | dkfjd | dkj > ddd.dd
                   % dkfjd | dkfjd | eir > eeee.ee
                   % dkfj ddd.dd eee.ee | eeee -x -y > xxx.yyy
                1056666 あいう商会
                1057777 かかか会社
                ・・・
              
            課題6−5: % xxx2 | yyy -xxx | dkfjd > dkfjd.dkfjd
                5 熊本県
                8 鹿児島県
                ・・・
                                      以上
           

演習で使用するコマンドの簡単な解説

演習で使用する機能・オプションに限定して説明。より詳しいオプション等の 説明はman コマンドで調べよ(% man command名)。
cat
more
sort
uniq
cut
wc
paste
head

cat

 形式:cat x y z ...
 解説:ファイルx, y, z,...を左から順に標準出力に(つなげて)出力する。
 例:
  % cat a.txt
  1
  3
  5
  % cat b.txt
  2
  4
  6
  % cat a.txt b.txt
  1
  3
  5
  2
  4
  6
コマンド一覧にもどる

more

 形式: more x
 解説: ファイルxの内容を標準出力に出力するが、ウィンドウの大きさに合わせて
    表示の一時停止をする。スペースを押すと、次が表示される。'q'で終了。
    また、標準入力からも入れることができる。以下の2行のコマンドは等価。
     % more x
     % cat x | more
コマンド一覧にもどる

sort

 形式:sort x y z ...
 解説:ファイルx y z ...をまとめてソートし、標準出力に出力する。。ソートとは、
    ファイル中の各行をアルファベット順(日本語の場合はあいうえお順)に
    並べなおすことである。入力ファイルは標準入力からでもよい。
 例:
  % cat a.txt
  え a
  う c
  あ b
  % cat b.txt
  い e
  お d
  % sort a.txt b.txt   (または % cat a.txt b.txt | sort )
  あ b
  い e
  う c
  え a
  お d

 形式:sort -k n  x y ...
 解説:ファイルx, y, ...をソートするときに、'n-1'の数だけ項目をスキップして
    各行を比較する。
 例:
  % cat a.txt
  え a
  う c
  あ b
  % cat b.txt
  い e
  お d
  % sort -k 2 a.txt b.txt  (または、% cat a.txt b.txt | sort +1 )
  え a
  あ b
  う c
  お d
  い e

*******
漢字やひらがな/カタカナなどが含まれる日本語テキストは、エンコーディングの関係でうまくソートできない。その場合は環境変数 LC_ALL=C または LANG=ja_JP.UTF-8 を設定する。

例

cat foo.txt | LC_ALL=C sort

コマンド一覧にもどる

uniq

 形式: uniq x
 解説:ファイルxから、隣接する重複行を削除し標準出力に出力する。
    (重複する行が複数行続くときに、1回しか出力されない)
    ファイルを省略すると、標準入力からの入力になる。
    (注意:行は完全に一致しているものだけ削除される)
 例:ファイルの中の重複した行を削除する。
  % cat a.txt
  あ
  い
  う
  え
  % cat b.txt
  い
  う
  え
  お
  % sort a.txt b.txt | uniq
  あ
  い
  う
  え
  お

 形式: uniq -d x
 解説: ファイルxの重複した行だけ標準出力に出力。
     xを省略すると、標準入力が入力となる。
 例:ファイルの中の重複した行を削除する。
  % cat a.txt
  あ
  い
  う
  え
  % cat b.txt
  い
  う
  え
  お
  % sort a.txt b.txt | uniq -d
  い
  う
  え

 形式: uniq -c x
 解説: 'uniq x'の出力の各行の先頭に重複の回数を付けて出力する。
 例:
  % cat a.txt
  あ
  い
  う
  え
  % cat b.txt
  い
  う
  え
  お
  % sort a.txt b.txt | uniq -c
     1 あ
     2 い
     2 う
     2 え
     1 お

コマンド一覧にもどる

cut

 形式: cut -fn1,n2,... x
 解説: ファイルxの各行から指定されたフィールドを取り出す。n1,n2...は数字を
    コンマで区切ったもので、この数字のフィールドを取り出す。フィールドは
    オプションを指定しなければ、タブで区切られた文字列が左から、1,2,3,...
    という番号となる。
 例:
  % cat a.txt
  あ      100     abc
  い      200     def
  う      300     ghi
  え      400     jkl
  お      500     mno
  % cut -f2 a.txt
  100
  200
  300
  400
  500
  % cat a.txt | cut -f1,3
  あ      abc
  い      def
  う      ghi
  え      jkl
  お      mno

コマンド一覧にもどる

wc

 形式: wc x
 解説:ファイルxの行数、単語数、文字数を出力する。行数は改行コードの数、
    単語は(半角)スペース、タブ、改行コードで挟まれた文字列のこと。
    文字数は、スペース、タブ、改行コード数を含む(すなわち、ファイルの
    バイト数に等しい)。日本語の場合は1文字2バイトなので、文字数
    とは解釈できない。xが省略されると、標準入力から入力されたファイルに
    対して処理する。
 例:
  % cat a.txt
  あ
  い
  う
  え
  % cat a.txt | wc
         4       4      12
 (左から、4行、4単語、12バイトを意味する。各行につき、日本語1文字
  2バイトと改行コード1バイト、合わせて3バイトである。4行あるので、
  3×4=12バイトとなる。日本語の場合は最初の行数しか意味がないと思ってよい。)
コマンド一覧にもどる

paste

 形式: paste x y z ...
 解説:ファイルx,y,z,...の対応する各行をマージして1行にして出力する。
    ファイル名の代わりに'-'を書くと、標準入力からの入力になる。
 例:
  % cat a.txt
  あ
  い
  う
  え
  % cat b.txt
  い
  う
  え
  お
  % paste a.txt b.txt
  あ      い
  い      う
  う      え
  え      お

コマンド一覧にもどる

head

 形式: head x y z ...
 解説:ファイルx,y,z...の各先頭10行を標準出力に出力する。
    ファイル名を省略すると、標準入力から読み込んだものの先頭10行を出力する。
 形式: head -n x y z ...
 解説:ファイルx,y,z,...の各先頭n行を標準出力に出力する。
 例:
  % cat a.txt
  あ
  い
  う
  え
  お
  % cat b.txt
  か
  き
  く
  け
  こ
  % head -3 a.txt
  あ
  い
  う
  % head -2 a.txt b.txt
  ==> a.txt <==
  あ
  い
  
  ==> b.txt <==
  か
  き

コマンド一覧にもどる