Last active
January 17, 2016 15:45
-
-
Save papiron/051774122944677bb7c9 to your computer and use it in GitHub Desktop.
シェル芸勉強会過去問第2回(問題と解答)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
解答は、勉強会で実際に解いてもらった問題のみ(問題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