コピペコードで快適生活

明日使えるソースを自分のために

初めの方のシェル芸勉強会メモ

初めの方の問題見たらとてもピュアだった。

2012年10月27日 Hbstudy#38

ファイルの一括変換

# カレントディレクトリの中からUtilの文字をHogeに変えてDesktopに保存する。
# ※basenameはディレクトリ名を除外したファイル名を返すコマンド
grep -r "Util" ./. 2> /dev/null | gsed 's/:..*$//' | while read f; do gsed 's/Util/Hoge/' $f> ~/Desktop/$(basename $f); done

集計

# 数値範囲でグルーピングして集計する
cat /dev/urandom | gtr -dc 0-9 | fold -w 2 | gsed 's/^0//' | head -n 100000 > ages
cat ages | gawk '{print int($1 / 10)}' | sort -n | uniq -c | gawk '{print $2*10"-"$2*10+9,$1}'
0-9 9961
10-19 9805
20-29 9813
30-39 10137
40-49 10026
50-59 10198
60-69 10144
70-79 9888
80-89 10025
90-99 10003

Uspstudy20121208qonly

条件でデータを抽出

cat hoge
a 12
a 13
b 13
a 432
b 111
b 43

cat hoge | gawk '{if(a[$1] < $2){a[$1] = $2}}END{for(i in a){print i, a[i]}}'

# awkで配列の中身を出力
for(i in array) {
  print i, a[i]
}

条件でデータを集計

cat num2
a 1
b 2 3 4
a 5 6
b 7 8 9 10

cat num2 | gawk '{for(i=2; i<=NF; i++){a[$1]+=$i}}END{for(i in a){print i,a[i]}}'
a 12
b 43

曜日ごとの集計

01/01の曜日を各年ごとに集計

seq 1990 2020 | gawk '{print $1 "0101"}' | while read i; do gdate -d $i '+%w'; done | sort | uniq -c | gawk '{print $2, $1}'

# 曜日を算出(0が日曜日)
gdate -d YYYYMMDD '+%w' 

ファイルの比較

# file2から、file1にない要素を取り出す
diff <(sort file1.txt) <(sort file2.txt) | grep '>' | gsed -e 's/> //'

# 標準入力同士の diff
diff <(command1) <(command2)