Tuesday, May 31, 2016

awk, 行を指定した上で、特定のフィールドの値を合計する

awk, 行を指定した上で、特定のフィールドの値を合計する。

 

たとえば、以下のようなファイルがあるとする。ファイル名は、仮に「kenkin.dat」

2016/5/29

献金の記録


5月8日 14000
5月8日 3000
5月15日 10600
5月22日 2000
5月29日 21106

合計

 

日付の入った行の2列目だけを合計したい。

awk '/5月/{sum+=$2; print sum}' kenkin.dat

とすれば、

14000
17000
27600
29600
50706

となる。つまり、最後の50,706円が求める値なのである。

 

 

awk, 挙動確認。split, print

awk の挙動確認です。

split 関数、そして、print。

 

$echo '2016-5-31' | awk 'split($0, a, "-"){print a[2]}'
5

 

$ echo '2016/5/31' | awk 'split($0, a, "/"){print a[2]}'
5

 

$ echo '2016/5/31' | awk 'split($0, a, "/"){print a[2]a[3]}'
531

 

 

 

 

sed, 日付の表示形式を変換。「2016.5.31」=>「2016/5/31」(いや、むしろ、「2016/5/31」=>「2016.5.31」)

(追記。2016年6月3日)

cat asty-ch_member.tab | gsed -e 's|\([0-9]{4}\)\.\([0-9]\?\)\.\([0-9]\?\)|\1/\2/\3|g' | less

 

いや、むしろ、「2016/5/31」=>「2016.5.31」、となってしまった。

まあ、それはそれで構いませんけどね。データの形式が、揃ってればいいんで。

========================================

日付の表示形式を変えたい。

一行の中に出てくる「2016.5.31」という日付表示を、「2016/5/31」に変えたい!

 

そこで、自分なりに頑張って、シェル芸に取り組んでみました。

 

要は、sed の使い方なんですけどね。

これでできました! バンザイ!

cat asty-ch_member.tab | gsed -e 's|\(....\)\.\(.\?\)\.\(.\?\)|\1/\2/\3|g' | less

 

手間取ったのは、sed での正規表現の書き方です。

shell でのワイルドカードの書き方と混同しておりました。

 (ただし、まだ、sed での改行がよく分からない・・・)

 

<参考にしたページ>

sed でのワイルドカードの書き方

http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231046/

正規表現意味
. 改行文字以外の任意の1文字
* 直前の1文字の0回以上の繰り返しに一致。直前の文字は正規表現でも構わない
^ 行の先頭
$ 行の末尾
[ ] かっこ内の任意の1文字に一致。ハイフン(-)で範囲指定もできる
[^ ] かっこ内の任意の1文字に不一致。ハイフン(-)で範囲指定もできる
\+ 直前の文字の1個以上の繰り返しに一致
\? 直前の文字の0または1文字に一致
\{n\} 直前の文字のn個の繰り返しに一致
\{n,\} 直前の文字のn個以上の繰り返しに一致
\{,m\} 直前の文字のm個以下の繰り返しに一致
\{n,m\} 直前の文字のn個以上,m個以下の繰り返しに一致
パターン1\|パターン2 パターン1またはパターン2のいずれかに一致
\(パターン\) パターンをグループ化する。マッチした内容は\1や\2として利用できる
\ 正規表現に使われる記号を普通の文字として扱う

date +%F ⇒ 2016-05-31

date +%F

は、2016-05-31 と表示されます。

 

そして、こうやっても

date “+%Y-%m-%d"

同じく、2016-05-31 と表示されます。

Saturday, May 21, 2016

ImageMagick, 画像の「明るさ」「彩度」「コントラスト」の調整

週報などに、写真を載せたいことがある。
どうせ、コピー用紙に白黒印刷をするだけなので、画像を細かく調整する必要はない。
しかし、これまでの経験から、iPad やデジカメで撮った写真を、そのままプリントアウトすると、コピー用紙に真っ黒に出てしまい、写真の内容が何が何だか分からなくなる。

だから、明るくした写真を、InDesign のファイルに貼り込みたいのです。

そんなとき、いちいち、Pixelmator を立ち上げたくない。コマンドラインからの操作で終わらせたい、と思った。

ありがとう、ImageMagick !
こんな感じでできました。
convert pentecostal_01.jpg -modulate 120,120 pentecostal_01_120.jpg
convert pentecostal_01_120.jpg -contrast pentecostal_01_120_contrast.jpg

<参考にしたページ>
http://imagemagick.rulez.jp/archives/375
 明るさの調整
convert <変換前の画像名> -modulate (value) <変換後の画像名>
例)convert before.jpg -modulate 120 after.jpg

彩度の調整
convert <変換前の画像名> -modulate 100 , (value) <変換後の画像名>
例)convert before.jpg -modulate 100,120 after.jpg

 コントラストの調整
convert <変換前の画像名> -contrast <変換後の画像名>
例)convert before.jpg -contrast after.jpg

Saturday, May 14, 2016

Vim が好きです

Vim が好きです。

触っていると、どきどきします。

VimFiler, Unite.vim も使えるようになりました。なんとか、Vimproc をインストールすることができたんです。

 

シェルスクリプト, Perl, HTML, CSS, 可能なら JavaScript と、進んでいきたい。

 

もう、寝よう・・・

grep, OR 検索

grep で、OR 検索をしたい。

 

わたしは、タスク管理に todo.txt も使っている。

※ 参考にしたページ
http://todotxt.com/
どのツールもしっくりこない人へ、『Todo.txt』によるタスクマネジメントのススメ

 

そして、todo.txt に関して、.bash_profile に以下のようにエイリアスを作っている。

alias t="todo.sh"
alias tl=“clear; t ls | sort -k 3,3 -k 2,2"
alias tls=“clear; t ls"
alias edt="vi /Users/myusername/Google\ Drive/Dropbox/command-MacOSX/todo-txt/todo.txt;tl"

 

たとえば、tl で確認した後、今日までの未消化タスクを、つまり、おとついから今日までの三日分のタスクを表示したかった。

そのとき、grep の OR 検索が必要となる。

tl | grep -e "5-12" -e "5-13" -e "5-14"

とするか、

tl | grep "5-12\|5-13\|5-14"

とすれば良い。でも、二番目の方が短くて良い。

 

(追記)

tl | grep "5-1[234]"

 でも同じ結果が得られる。短いからこっちの方がもっといいな。

 

実際にやってみると、

01 (A) 2016-05-12 Thu (幼) +hmwr @deskwork
02 (A) 2016-05-12 Thu (幼) +hmwr @deskwork
03 (B) 2016-05-13 Fri  +asty @think
04 (B) 2016-05-13 Fri  +北海教区 @deskwork
05 (B) 2016-05-13 Fri  +北海教区 @deskwork
06 (A) 2016-05-14 Sat  +asty @write
07 (B) 2016-05-14 Sat  +asty @deskwork

 

未消化タスクが7つ、表示された。
(細かいタスクはもっとあるけどね・・・) 

 

※ 参考にしたページ
grepを使った便利なコマンド一覧 

Wednesday, May 11, 2016

bash, 複数ファイルの拡張子を一括変換

bash, 複数ファイルの拡張子を一括変換

for f in *; do mv $f ${f%JPG}jpg; done

 

そうすると、

01_hiyoko.JPG  02_hiyoko.JPG  03_hiyoko.JPG
04_hiyoko.JPG  05_hiyoko.JPG  06_hiyoko.JPG
07_hiyoko.JPG  08_hiyoko.JPG  
09_hiyoko.JPG
10_hiyoko.JPG  11_hiyoko.JPG  12_hiyoko.JPG

が、

01_hiyoko.jpg  02_hiyoko.jpg  03_hiyoko.jpg  04_hiyoko.jpg
05_hiyoko.jpg  06_hiyoko.jpg  07_hiyoko.jpg  08_hiyoko.jpg
09_hiyoko.jpg  10_hiyoko.jpg  11_hiyoko.jpg  12_hiyoko.jpg

と、なりました。

 

ちなみに、bash でファイルを縦に並べて表示するコマンドは

ls -1

また、一つ学びました!

 

※ 参考にしたページ

http://www.d-wood.com/blog/2014/06/26_6412.html