Showing posts with label AWK. Show all posts
Showing posts with label AWK. Show all posts

Saturday, June 4, 2016

grep, sort, awk, 「現住陪餐会員と現教職のみ」を検索して表示

grep,  sort, awk, 「現住陪餐会員と現教職のみ」を検索して表示したい。

grep -e "現住陪餐会員 \| 現教職" asty-ch_member.tab | LANG=ja_C sort -k4,4 -k5,5 | awk '{print NR": ",$1,$6,$7,$8,$4,$5}' | less

 

すると、

1:  姓名  男性  現住陪餐会員  1973/5/31  せい  めい

こんな感じで表示される。

Friday, June 3, 2016

birthday_search.sh の改良。年齢も表示される

birthday_search.sh を改良し、年齢も表示されるようにした。大分、苦労したけど、何とかできた。うれしいね。
http://fun-sootv.blogspot.jp/2016/06/blog-post.html

こんな感じ。
531    ○○歳    名前    現住陪餐会員    男性    郵便番号    住所    1973/5/31

早速、bdsearch, agcalc という名前で、bash_profile にエイリアスを設定しておいた。

#!/bin/bash
# 実行時に指定された引数の数、つまり変数 $# の値が 2 でなければエラー終了。
if [ $# -ne 2 ]; then
    echo "指定された引数は$#個です。" 1>&2
    echo "実行するには2個の引数が必要です。" 1>&2
    exit 1
fi

# シェル変数を二つ設定する。start_day=検索開始日。end_day=検索終了日。
# nkf で、改行コードを Unix 形式に変える。
# gsed で、1973.5.31 という日付表示を 1973/5/31 という表示形式に変える。
# この段階で一回、ファイルに書き出しておく。何か別の目的に使えるかもしれないので。<= やっぱり、やめた。
# 「0531」などと表現された誕生日のうち、awk で、検索開始日と検索終了日の範囲に該当する者を抜き出す。
# ただし、召天者ははじく。
# sort して、less で表示。
start_day="$1"
end_day="$2"

#now=`date "+%Y%m%d"`
now_Y=`date "+%Y"`
now_m=`date "+%-m"`
now_d=`date "+%-d"`

cat ~/ディレクトリ/asty-ch_member.tab | nkf -Luw | gsed -e 's|\([0-9]{4}\)\.\([0-9]\?\)\.\([0-9]\?\)|\1/\2/\3|g’ |  awk '$9 >= '${start_day}' && $9 <= '${end_day}' && $7 != "召天者" {split($8,my_birthday,"/"); if('${now_m}' < my_birthday[2]){print $9,my_age = ('${now_Y}' - my_birthday[1] - 1 )"歳",$1,$7,$6,$10,$11,$8}
else if('${now_m}' > my_birthday[2]){
   print $9,my_age = ('${now_Y}' - my_birthday[1])"歳",$1,$7,$6,$10,$11,$8}
else if('${now_m}' == my_birthday[2] && '${now_d}' < my_birthday[3]){
   print $9,my_age = ('${now_Y}' - my_birthday[1] - 1 )"歳",$1,$7,$6,$10,$11,$8}
else if('${now_m}' == my_birthday[2] && '${now_d}' >= my_birthday[3]){
   print $9,my_age = ('${now_Y}' - my_birthday[1])"歳",$1,$7,$6,$10,$11,$8}
}' | sort | less

うれしい! でも、疲れた〜

Thursday, June 2, 2016

birthday_search.sh, 誕生日検索。検索開始日と検索終了日の間の期間に該当する「誕生日の方」を抜き出し、表示する

検索開始日と検索終了日の間の期間に該当する「誕生日の方」を抜き出し、表示したい。

 

毎月、「教会カレンダー」を作成し、誕生日の方のお名前を記入している。

そして、「教会カレンダー」を見ながら、その月に誕生日を迎える方に、「誕生日  お祝い葉書」を書いて送るのだ。

 

今までは、FileMaker Pro を立ち上げて、その月の誕生日該当者を検索していた。

それを、シェル芸を使って行いたい。

 

===>    なんとか、できました!    うれしいね!!

 

#!/bin/bash

# 実行時に指定された引数の数、つまり変数 $# の値が 2 でなければエラー終了。
if [ $# -ne 2 ]; then
    echo "指定された引数は$#個です。" 1>&2
    echo "実行するには2個の引数が必要です。" 1>&2
    exit 1
fi

# シェル変数を二つ設定する。start_day=検索開始日。end_day=検索終了日。

# nkf で、改行コードを Unix 形式に変える。
# gsed で、1973.5.31 という日付表示を 1973/5/31 という表示形式に変える。
# この段階で一回、ファイルに書き出しておく。何か別の目的で使えるかもしれないので。

# 「0531」などと表現された誕生日のうち、awk で、検索開始日と検索終了日の範囲に該当する者を抜き出す。
# ただし、召天者ははじく。
# sort して、less で表示。

start_day="$1"
end_day="$2"

cat ~/ファイルのあるディレクトリ/asty-ch_member.tab | nkf -Luw | gsed -e 's|\(....\)\.\(.\?\)\.\(.\?\)|\1/\2/\3|g' > ~/ファイルのあるディレクトリ/asty-ch_bsearch.txt

cat ~/ファイルのあるディレクトリ/asty-ch_bsearch.txt | awk '{if($9 >= '${start_day}' && $9 <= '${end_day}' && $7 != "召天者")print $9,$1,$7,$6,$10,$11,$8}' | sort | less

 

我流だし、まだまだ工夫の余地はあるのだろうけれど、自分なりに書いた、記念すべき「初めてのシェルスクリプト」(もちろん、よく分かっていないところも多々あります・・・) 。

誕生日検索なので、birthday_search.sh と名付けました!

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