投稿

ラベル(shell script)が付いた投稿を表示しています

teeで中間ファイルをやっつける

ファイルを一行ずつ読み込んで sagasu_AがあればA.txt sagasu_BがあればB.txt へ流し込んでいきたい場合 cat oreno.txt | tee \ >(grep -E "sagasu_A" >> A.txt) \ >(grep -E "sagasu_B" >> B.txt) > /dev/null ちなみに、遅い

rmarkdown::render

rmarkdownをrenderするのがめんどかった。さらに出来上がりを確認するのにわざわざhtmlを開くのもめんどかった。。。以下のスクリプトをパスの通ったディレクトリに置いておいて、 render oreno.rmd とすればrenderしてさらに勝手にブラウザでopenしてくれる。 !/bin/bash html=${1%%.rmd}.html Rscript -e "rmarkdown::render('$1')" open $html

awkオーバーフロー

awkの数値比較は1e-308あたりでおかしくなるらしい。 https://lists.gnu.org/archive/html/bug-gawk/2015-04/msg00011.html 上記を参考にすると、1e-308を下回りそうな値については0を足すことで0と判定させることができ、この値と比較することで正しい数値比較ができる。 たとえば、ある値が1e-6以下なら表示させたいとする。しかし、この中に1e-308より小さいのがあると漏らす。 間違う例(1e-6以下なら表示したい) >> echo 1e-666 | awk '{if($1<1e-6) {print $1}}' 正しく判定できる例 >> echo 1e-666 | awk '{if(!($1+0)<1e-6) {print $1}}' 1e-666

プロセス置換

プロセス置換というものを知った。無断な中間ファイルを作らなくてすむ。具体的には以下 並び直してjoinしたいとき join <(sort a.txt) <(sort b.txt) 何行あるかわからないコメントをのぞいてpasteしたいとき paste <(grep -v -E "^#" a.txt) <(grep -v -E "^#" b.txt) そのほかの活用例 例1

shellでエラー処理

hogeという関数を実行してエラーした時だけfugaという関数を適応したいとする hoge || fuga でいける。とても簡単。 ぎゃくに、hogeが成功した時だけfugaを実行するためには hoge && fuga で良い。

ファイルの存在確認

ややこしい if [ -e $myfile ]; then echo "arimasuyo" fi ではだめ。myfileが展開されないため。変数で指示したいなら if [ -e "$myfile" ]; then echo "arimasuyo" fi ANDやORも使うことができる。ちなみに -e の前後などには全てスペースが必要。 if [ -e "$myfile" ] && [ -e "$myfile2" ] ; then echo "motto arimasuyo" fi if [ -e "$myfile" ] || [ -e "$myfile2" ] ; then echo "motto arimasuyo" fi さらに、ファイルのサイズが0以上かどうかを判定するときは -sを使う if [ -s "$myfile" ] ; then echo "myfile is size > 0" else echo "myfile is size == 0" fi

joinに失敗

https://qiita.com/taruhachi/items/04ccca5e3bc20ad01791  より join が嫌いだ。並べども並べども join: hoge: is not sorted: とかいうから。これは LANG の設定の問題で、 sort 時と join 時の言語設定により生じる誤差を行っているらしい。強制的に LANG=C を指定することで回避できる。 LANG=C sort hoge > sorted_hoge LANG=C sort fuga > sorted_fuga LANG=C join sorted_hoge sorted_fuga > hogefuga すみません勉強不足でした。

awkで最大値・最小値

以下のようにして実装できる。関数の定義と三項演算子の使用がポイント。 echo "6 5 " | awk ' function max(a, b) { return a>b ? a : b } {print max($1, $2)} ' シングルクオートの中は改行しようと ; があろうとなかろうとどうでも良い。

shellで集合演算

シェルで集合演算をやりたかった。でもあまり自信がなかったのでいつもRの %in% で済ませていた。以下のようにしてできるらしい。 論理和 cat a b | sort | uniq 論理積 cat a b | sort | uniq -d 排他的論理和 cat a b | sort | uniq -u 差集合(A-B) (cat a b | sort | uniq -u; cat b) | sort | uniq -d 差集合(B-A) (cat a b | sort | uniq -u; cat a) | sort | uniq -d