第2回チキチキ! シェル芸人養成勉強会 参加報告

■幽霊部員として参加してきました。
 ハッシュタグ付きの私のつぶやきがハッシュタグ検索でヒットしないという幽霊っぷりでした。
 ※twilogではヒットしました。

 USP友の会会長 presents 第2回チキチキ! シェル芸人養成勉強会 USP友の会 上田 隆一
 http://www.slideshare.net/ryuichiueda/uspstudy20121208qonly

■今回は「... 」ではじまる行が、私のコメントです。

■問題1: 文字化けしたファイルの削除

● 次のように、空ファイル abc, DEFG と、 文字化けした空ファイルを作ってください。
● 文字化けしたファイルを消してください。 
ただし、日本語の入力は禁止です。

...業務として使うには、inodeを引くワンクッションを心がけましょう。

$ echo abc DEF ほげほげ | for n in `xargs`;do touch $n;done
$ echo abc DEF ほげほげ | nkf -s | for n in `xargs`;do touch $n;done
$ ls -i | grep -v [A-z]
51651025 ▒ق▒▒ق▒
51650995 ほげほげ

$ ls -i | grep -v [A-z] | awk '{print $1}' | for n in `xargs`;do find . -inum "$n" -print;done
./?ق??ق?
./ほげほげ
$ ls -i | grep -v [A-z] | awk '{print $1}' | for n in `xargs`;do find . -inum "$n" -exec rm -f {} \; ;done

■問題2: 計算

● 以下のファイル中の数字を全部足し算してください。

... あ、numファイル作るの忘れてました。。。

$ echo "1
2 3 4
5 6
7 8 9 10" | sed s/" "/"\n"/g | awk '{sum+=$1};END{print sum}'
55

■問題3: 条件でデータを取り出し

● 右のhogeファイルから、 aとbについてそれぞれ一番 大きな数を求めましょう。


...「aとbの最大値が一つづつか?」という探りのスクリプトで充分だった。

$ echo "a 12
a 13
b 13
a 432
b 111
b 43" > hoge

$ sort -k 2 -nr hoge | head -2
a 432
b 111

■問題4: 計算

● 以下のファイル中の数字を全部足し算してください。

... aとbを別でね。

$ echo "a 1
b 2 3 4
a 5 6
b 7 8 9 10" > num2

$ for ab in a b ;do echo -n "$ab ";grep ^${ab} num2 | sed s/"${ab}\| "/"\n"/g | awk '{sum+=$1}END{print sum}';done
a 12
b 43

■問題5: 日付と曜日
● 以下のようにファイルを作って、 何曜日が何日あるか集計してください。

... まあ、曜日はモジュラなので数字でもよしw。。。

$ seq 1990 2012 | awk '{print $1 "0101"}' > osyoga2
$  for n in `cat osyoga2`;do date --date $n '+%w';done | sort | uniq -c
      3 0
      4 1
      3 2
      3 3
      3 4
      3 5
      4 6

$ for n in `cat osyoga2`;do date --date $n '+%w %a';done | sort | uniq -c | awk '{print $1,$3}'
3433334 土

■問題6: ダミーデータの作成

● seq 1 100 の出力をランダムに並び替えてください。

...randの重みの大きい順に。

$ seq -w 1 100 | awk '{print rand(),$1}' | sort -nr | awk '{print $2}' | head -5
001
032
075
052
063

■問題7: 検索

● 大文字小文字を区別しない場合、以下の辞書ファイルから、 重複する単語を検索してください。
  – asciiコード以外の字がありますが、 とりあえず気にしないでください。

...1より大きい出現頻度の単語を出力。

$ cat /usr/share/dict/words | tr '[A-Z]' '[a-z]' | sort | uniq -c | awk '($1>1){print $2}' | wc -l
1498

問題8: ファイルの比較

● file2から、file1にない数字を抽出してください。

... diffもjoinも使わない制限だったので。。。

$ echo "1
3
4
6
9" > file1

$ echo "2
3
4
5
9" > file2

$ cat file[12] file1 | sort | uniq -c | awk '($1<2) {print $2}'
2
5

■ 問題9: 形式変換

● 左のようなファイルを作り、 右のように整形してください。

... 問題は手書きで良いですw。。。

$ n=1;echo "2,2 0,1 3,0 3,0 0,0" | \
  for s in `xargs`;do \
    echo "$n $s" | \
    sed s/","/" "/g | \
    awk '{printf $1" 表 "$2"\n"$1" 裏 "$3"\n"}'; \
    let n++; \
  done > game

$ awk '{print $1}' game | sort -u | xargs echo -e "  "; \
  for x in "" "";do echo -n "$x ";grep "$x" game | awk '{print $3}' |xargs echo;done
   1 2 3 4 52 0 3 3 02 1 0 0 0

■問題10: ファイルの結合

● file1、file2 から、下の出力を得てください。

... 最後はサービス問題です。

$ echo "001 うそ
002 笑止
003 矢追純" > file1

$ echo "001 800
002 10000000
003 1" > file2

$ join file[12]
001 うそ 800
002 笑止 10000000
003 矢追純 1