bashのブレース展開で連番のファイルを作成

bashではブレース展開を用いることで、連番のファイルを作成することが出来る

{<開始>..<終了>}

例1 001.txtから020.txtまでを作成

$ touch {001..020}.txt  
$ ls
001.txt  003.txt  005.txt  007.txt  009.txt  011.txt  013.txt  015.txt  017.txt  019.txt
002.txt  004.txt  006.txt  008.txt  010.txt  012.txt  014.txt  016.txt  018.txt  020.txt

例2 A-Zまで表示

$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Pythonのデコレータ

作成した関数を書き換えずに、その関数の働きに変更を加えたい時、デコレータを用いることができる。 デコレータとは、入力として関数(変更を加えたい関数)を取り、出力として別の関数(変更を加える関数)を取る関数のことである。


具体例
引数として取ったふたつの数の和を返す関数add()があったとする。

def add(a,b):
    return a+b

>>> add(3,4)
7

この関数を、中身を書き換えずに、"引数として取った二つの数の和の自乗"を返すようにしたい(つまり3と4を入れると72の49を返すようにする)。
ここで、デコレータを用いる。

デコレータは、引数として取った関数に対して処理を行う別の関数を定義し、その別の関数を返す。

def square(func):
    def new_func(*args,**kargs):
        result = func(*args,**kargs)
        return result ** 2
    return new_func

作成したデコレータで関数を修飾するには、修飾したい関数の定義の直前に@<デコレータ名>とすればよい

@square
def add(a,b):
    return a+b

>>> add(3,4)
49

TensorFlowで乱数生成

一様分布

random_uniform関数を用いて一様に分布する乱数を生成する サンプル

#coding:utf-8

import tensorflow as tf

#100次元、0から10まで一様に分布する不動少数点型の変数を作成
uniform = tf.random_uniform( \
        [100],minval=0,maxval=10,dtype=tf.float32)

sess = tf.Session()

with tf.Session() as session:
    print uniform.eval()

正規分布

random_uniform関数を用いて正規分布する乱数を生成

#coding:utf-8

import tensorflow as tf

norm = tf.random_normal([100],mean=0,stddev=10)

with tf.Session() as session:
    print norm.eval()

シェルスクリプト覚え書きその2 制御構造編

条件分岐

  • if文
    例:ひとつ目の引数が1ならYES,そうでないならNOと出力
#!/bin/bash

if [ "$1" = "1" ] ;then # [,],=の前後にスペースが必要  
    echo "YES"
else
    echo "NO"
fi

比較

  • 文字列の比較
    str1 = str2 str1とstr2が等しい
    str1 != str2 str1とstr2が等しくない
    -n str1 str1が空
    -z str1 str1は空ではない

  • 整数の比較
    int1 -eq int2 int1 == int2
    int1 -ne int2 int1 != int2
    int1 -lt int2 int1 < int2
    int1 -le int2 int1 <= int2
    int1 -gt int2 int1 > int2
    int1 -ge int2 int1 >= int2

例:2つの引数のうち小さい方を表示する

if [ "$1" -le "$2" ];then
    echo $1
else
    echo $2
fi
  • case文
    <文字列>が<パターン>に一致する場合に処理を実行して抜ける
case <文字列> in 
    <パターン1>)
        処理
        ;;
    <パターン2>)
        処理
        ;;
esac

繰り返し

  • for文
    for文を用いるとリストの各要素について順番に処理を行うことが出来る
for <変数名> in <リスト>
do
    繰り返す部分
    ここではリストの各要素が変数名で参照できる
done  

例 001.txtから005.txtまでの5つのファイルを作成*1

#!/bin/bash

for n in $(seq 1 5)
do
    touch "00$n.txt"
done
  • while文
    <条件>が真である(終了ステータスが0である)間は繰り返し処理を行う
while <条件(コマンド)>
do
    繰り返し処理
done

例:無限ループ
一秒ごとにhogeと言う

#!/bin/bash

while :
do
  echo hoge
  sleep 1
done

*1:実際にはブレース展開のほうが便利 katorinax.hatenablog.com

シェルスクリプト覚え書き シェル変数と引数 編

変数関連

  • 変数の定義

file=/media/usr-name/
変数名に使えるのは アルファベット、数字、アンダースコアのみ

  • 変数の参照

変数の値を参照する際には、変数名の前に$をつける。

echo $file  
/media/user-name/

コマンド置換

コマンド置換を利用することで、コマンドの吐いた標準出力を文字列として取得することが出来る。
コマンド置換:$(<コマンド名>)
例 シェル変数filenameに、現在時刻を代入する

$ filename=$(date|tr ' ' '_')
$ echo $filename
Mon_Apr__3_14:30:20_JST_2017

コマンドライン引数を用いる

位置パラメータというシェル変数を用いることで、シェルスクリプトコマンドライン引数を導入できる

  • 位置パラメータ
    $ ./hoge.sh aaa bbb と引数付きでシェルスクリプトを実行した際、
    “./hoge.sh"は$0 "aaa"は$1 "bbb"は$2というシェル変数に格納される
    引数の個数(この場合は2つ)は$#、引数全体(この場合はaaa bbb)は$@というシェル変数に格納される # 具体例
    位置パラメータを表示するシェルスクリプト param.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $#
echo $@

実行

$ sudo chmod +x param.sh
$ param.sh aaa bbb  
./param.sh # $0
aaa        # $1
bbb        # $2
           # $3(無い)
2          # $#(引数の数)
aaa bbb    # $@(すべての引数)

シェルスクリプトをどこからでも実行できるようにする

通常シェルスクリプトは、シェルスクリプトが存在しているディレクトリで$ ./hoge.shとタイプすることで実行する
これを、どのディレクトリからでも、シェルの名前だけで実行できるように設定する

  1. シェルスクリプトを保存しておくディレクトリを作成
    $ mkdir ~/bin
  2. サーチパスに~/binを追加
    $ PATH="$PATH:~/bin"
  3. スクリプトに実行権限を追加
    $ sudo chmod +x hoge.sh

ディレクトリ ~/bin にシェルスクリプトを配置すれば、スクリプトの名前をタイプするだけで$ hoge.shで実行できるようになった

sedの使い方

sed はストリームエディタの略
vimEmacs,メモ帳と言った対話型エディタとは異なり、ストリームエディタはファイルを加工して結果を標準出力に書き出す。
-i オプションで上書きする。


  • 行を指定して削除
    $ sed <数字>d ファイル名 でファイルの<数字>行目を削除できる
    例1:1行目を削除 $ sed 1d hoge.txt
    例2:3から10行目を削除 $ sed 3,10d hoge.txt
    正規表現を指定に用いることも出来る。
    この場合、正規表現をスラッシュで囲む。
    例3:先頭がAで始まる行を削除 $ sed /^A/d hoge.txt

  • 行を指定して表示
    $ sed -n <数字>p ファイル名 でファイルの<数字>行だけを出力できる

  • 文字列を指定して置換
    $ sed s/<置換前>/<置換後>/フラグ ファイル名 でファイルの<置換前>文字列を<置換後>文字列に変換できる
    置換前文字列には正規表現を用いることが出来る
    フラグにはgを指定すると見つかったすべての文字列を置換できる