初めの方のシェル芸勉強会メモ
初めの方の問題見たらとてもピュアだった。
ファイルの一括変換
# カレントディレクトリの中から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
条件でデータを抽出
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)