大阪大学医学部 Python会

Now is better than never.

シェルスクリプト入門(1)

2018-11-01(Thu) - Posted by 水野 in 技術ブログ    tag:Shell script

Contents

    python会なのにpythonまだ触ったことありません。勉強せねば。

    データ整形の流れって、教わる機会なくないですか? つまらないものですが、僕のやり方を紹介してみます。 始めたばかりの人は参考にしてください。 経験者の方、変なとこあったらどしどし突っ込みください! そして皆さんの自己流も教えてもらえると嬉しいです。

    1) scriptに起こす前

    shell scriptに書き起こす前に、プロンプト画面(Mac,Ubuntuならterminal)でテストします。 僕はいつもcatでファイルにつないで、パイプの後に試したいコマンドを打ちます。 その後にパイプでheadにつないで、頭だけ出力してみます。たいていファイル重いので。 圧縮ファイルの時は、解凍する前にzcatでつないで試します。

    cat hogehoge.txt | sed 1d(試したいコマンド)| head
    zcat hoge.gz | cut –f1(試したいコマンド)| head
    

    一行が長くて確認しづらい!と思ったら、headからless –Sにつなぎます。 別画面で折り返しなしで見ることができます。

    cat hogehoge | sed 1d(試したいコマンド)| head | less -S
    

    2) scriptを書く

    うまくいきそうで、だいたい流れが思い描けたらshell scriptに書き起こします。 結局他のファイルも同じ処理をするはめになり、scriptに残しておけば・・と後悔することが多いからです。

    touch test.sh # ファイルつくって、
    emacs test.sh # emacsで開く。
    
    #!/bin/bash # おまじない。
    $1=filename # ファイルはいつも外から入れれるようにしてます。
    rm –r ./folder # 一発で上手くいくことはないので、やり直しやすいように消去コマンド。
    mkdir ./folder # 散らからないように専用フォルダを作成。
    dir1="./folder" # フォルダ名をいつでも変えやすいようにパスを変数にいれる。
    cat "$filename" | sed 1d > "$dir1"/hogehoge2.txt #目的のコマンドで処理して保存。
    

    3) 実行

    書けたら、処理したいファイルを渡して実行してみます。 &はバックグラウンド実行です。

    bash ./test.sh ./hogehoge.txt &
    

    時間がかかりそうで家に帰りたいときは、nohupでサーバーと切れても大丈夫なように。 screenを使うこともあります。

    nohup bash ./test.sh ./hogehoge.txt &
    

    4) 修正

    scriptを修正するときは、元の文は#をつけてコメントアウトしときます。 そうすれば、後でやり直しやすいです。

    # cat "$filename" | sed 1d > "$dir1"/hogehoge2.txt # コメントアウトして置いておく。
    cat "$filename" | grep "blahblah" > "$dir1"/hogehoge2.txt # 新しい文。
    

    どこでバグってるか分からない時は、とりあえずechoで変数を出してみたりしてチェックしてます。

    5) 応用編

    あとはひたすらコマンドを駆使して書き上げていきます。 以下の基本コマンドでだいたいのことはできるかと。 特にawkはたくさんのことができます。joinも重宝します。

    command 説明
    cat ファイルを縦につなぐ
    paste ファイルを横につなぐ
    sed 指定行抜き出すor削除or文字置換
    cut 指定列抜き出すor削除
    awk 抜き出し方をいろいろカスタマイズ
    tr 文字置換
    sort 整列
    uniq 重複行を削除or抜き出す
    join 2つのファイルを同じ項目で合わせる
    grep 特定の文字が入った行を出す

    各コマンドのオプションの使い方が重要ですが、長くなってきたので詳細はまたの機会に。