Skip to content

Instantly share code, notes, and snippets.

@papiron
Last active January 17, 2016 15:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save papiron/051774122944677bb7c9 to your computer and use it in GitHub Desktop.
Save papiron/051774122944677bb7c9 to your computer and use it in GitHub Desktop.
シェル芸勉強会過去問第2回(問題と解答)
解答は、勉強会で実際に解いてもらった問題のみ(問題2、問題3、問題4)
問題1: 文字化けしたファイルの削除
次のように、空ファイル abc, DEFG と、文字化けした空ファイルを作ってください。
【今回は問題データのQ1ディレクトリ以下に作成済み】
$ touch abc
$ touch DEFG
$ echo ほげ | nkf -s | xargs touch
$ ls
%82ق%B0 DEFG abc
文字化けしたファイルを消してください。ただし、日本語の入力は禁止です。
使いそうなコマンド: xargs、grep、tr、tarr
問題2: 計算
以下のファイル中の数字を全部足し算してください。
$ cat Q2/num
1
2 3 4
5 6
7 8 9 10
使いそうなコマンド: bc、tr、yarr、tarr、awk、numsum、ysum、sum2
解答:
純粋awk芸
$ awk '{for(i=1;i<=NF;i++)sum+=$i}END{print sum}' num
55
そのままの並びで計算
$ cat Q2/num | tr ' ' '+' | bc | numsum
$ cat num | numsum -r | numsum
$ cat Q2/num | ysum | self NF | sm2 0 0 1 1
横に並べる
$ cat num | tr '\n' ' ' | awk '{for(i=1;i<=NF;i++)sum+=$i;print sum}'
55
$ cat num | tr '\n' ' ' | numsum -r
$ cat num | yarr | ysum | self NF
縦に並べる
$ cat num | tr ' ' '\n' | awk '{sum+=$1}END{print sum}'
$ cat num | tr ' ' '\n' | numsum
$ cat num | tarr | sm2 0 0 1 1
問題3: 条件でデータを取り出し
下のhogeファイルから、aとbについてそれぞれ一番大きな数を求めましょう。
$ cat Q3/hoge
a 12
a 13
b 13
a 432
b 111
b 43
使いそうなコマンド: awk、sort、getlast
解答:
純粋awk芸その1(if文)
$ awk '{if(a[$1]<$2)a[$1]=$2}END{for(v in a){print v,a[v]}}' hoge
a 432
b 111
純粋awk芸その2(パターン)
$ awk 'a[$1]<$2{a[$1]=$2}END{for(v in a){print v,a[v]}}' hoge
sortとuniqのコンビネーション
$ cat hoge | sort -k1,1 -k2,2nr | awk '{print $2,$1}' | uniq -f 1
432 a
111 b
Tukubai芸
$ cat hoge | sort -k1,1 -k2,2n | getlast 1 1
問題4: 計算
以下のファイル中の数字を、キー(a,b)ごとに全部足し算してください。
$ cat Q4/num2
a 1
b 2 3 4
a 5 6
b 7 8 9 10
使いそうなコマンド: awk、tarr、yarr、sort、sm2、ysum、self
解答:
純粋awk芸
$ awk '{for(i=2;i<=NF;i++)a[$1]+=$i}END{for(v in a){print v,a[v]}}' num2
a 12
b 43
横に並べて足し算
awkで一度横に整形後、awkで集計。
$ cat num2 | awk '{for(i=2;i<=NF;i++)a[$1]=a[$1]" "$i}END{for(v in a){print v a[v]}}' | awk '{sum=0;for(i=2;i<=NF;i++)sum+=$i;print $1,sum}'
縦に足し算
awkで一度縦に整形後、awkで集計。
$ cat num2 | awk '{for(i=2;i<=NF;i++){print $1,$i}}' | awk '{a[$1]+=$2}END{for(v in a){print v,a[v]}}'
Tukubai芸
$ cat num2 | sort | tarr num=1 | sm2 1 1 2 2
$ cat num2 | sort | yarr num=1 | ysum num=1 | self 1 NF
問題5: 日付と曜日
以下のようにファイルを作って、何曜日が何日あるか集計してください。
【今回は問題データのQ5ディレクトリ以下に作成済み】
$ seq 1990 2012 | awk '{print $1 "0101"}' > osyoga2
$ head -n 5 osyoga2
19900101
19910101
19920101
19930101
19940101
使いそうなコマンド: date、yobi、xargs、sed、uniq、count
問題6: ダミーデータの作成
seq 1 100 の出力をランダムに並び替えてください。
使いそうなコマンド: 敢えて無しで・・・
問題7: 検索
大文字小文字を区別しない場合、以下の辞書ファイルから、重複する単語を検索してください。
asciiコード以外の字がありますが、 とりあえず気にしないでください。
$ head Q7/words
A
A's
AA's
AB's
ABM's
AC's
ACTH's
AI's
AIDS's
AM's
使いそうなコマンド: tr、sort、uniq、count・・・
問題8: ファイルの比較
file2から、file1にない数字を抽出してください。
$ cat Q8/file1
1
3
4
6
9
$ cat Q8/file2
2
3
4
5
9
使いそうなコマンド: diff、uniq、grep、comm、join0
問題9: 形式変換
gameから、resultように整形してください。
$ cat Q9/game
1 表 2
1 裏 2
2 表 0
2 裏 1
3 表 3
3 裏 0
4 表 3
4 裏 0
5 表 0
5 裏 0
$ cat Q9/results
1 2 3 4 5
表 2 0 3 3 0
裏 2 1 0 0 0
使いそうなコマンド: self、map、tateyoko
問題10: ファイルの結合
file1、file2 から、下の出力を得てください。
$ cat Q10/file1
001 うそ
002 笑止
003 矢追純
$ cat Q10/file2
001 800
002 10000000
003 1
欲しい出力
001 うそ 800
002 笑止 10000000
003 矢追純 1
使いそうなコマンド: awk、join、join1、loopj
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment