labunix's blog

labunixのラボUnix

「第10回シェル芸勉強会」を解いてみた。

■「第10回シェル芸勉強会」を解いてみた。

 【本番資料】第10回シェル芸勉強会
 http://blog.ueda.asia/?p=2378

Q1. 次の数字の列を足し算してください。(できる人はなるべく変態的に)

$ echo 2 5 9 8 1 3 7 4
2 5 9 8 1 3 7 4

■普通にシンプルに。

$ echo 2 5 9 8 1 3 7 4 | sed s/" "/"+"/g | echo $((`xargs`))
39

Q2. スペースと数字と改行を使って次のようなファイルを作り、
   書いた数を足し算してください。

$ cat num 
        1
 
2 3         
         4            5
        6    7
 
8      9

■Q1と同じ。

$ cat num | sed s/" "/"+"/g |  echo $((`xargs`))
45

Q3. 文字数を数えてください。改行記号は数えないでください。

$ cat genkou
筆者は朝、目玉焼きを食べた。
昼、著者は卵がけごはんを食べた。
そして夜、著者はマンハッタンの夜景を
見ながらゆで玉子を食べた。

■行に変換

$ sed s/./"&\n"/g genkou | grep -v "^\$" | wc -l
61

Q4. 次のようなファイルを作り、ファイルの中に三個存在する文字を出力してください。

$ cat hoge 
aabbcdabbcccdd

■行に変換、wcの結果を使う。

$ sed s/./"&\n"/g hoge | sort | uniq -c | awk '($1==3){print $2}'
a
d

Q5. 次のようなファイル、ディレクトリを作ってください。
    そして、file1, file2, file3をカレントディレクトリに移動してください。


$ mkdir -p a/b/c
$ touch a/file1 a/b/file2 a/b/c/file3
$ tree
.
└── a
    ├── b
    │   ├── c
    │   │   └── file3
    │   └── file2
    └── file1
 
3 directories, 3 files

■mv前に「`xargs`」を外して確認しましょう。

$ find a -name "file*" | \
  for list in `xargs`;do \
    echo "$list" | awk -F\/ '{print "mv "$0" "$NF}' | `xargs`; \
  done

Q6. 次のようにファイルとディレクトリを作り、
    hogeと書いてあるファイルをディレクトリa、
    それ以外のファイルをディレクトリbに振り分けてください。

$ echo hoge > file1
$ echo huge > file2
$ echo hoge > file3
$ echo hoge > file4
$ mkdir a b

■普通の分岐。

$ for list in file[0-9];do \
    grep hoge "$list" > /dev/null 2>&1 && mv "$list" a/ || mv "$list" b/; \
  done

$ tree
.
├── a
│   ├── file1
│   ├── file3
│   └── file4
└── b
    └── file2

2 directories, 4 files

Q7. 以下の9つのファイルについて、二つのファイルの組み合わせを
    全て列挙してください。ただし、重複してはいけません。

$ touch file{1..9}
$ ls file{1..9}
file1  file2  file3  file4  file5  file6  file7  file8  file9

■ファイルの作成が要らなかった。。。

$ for n in `seq 1 9`;do \
    for m in `seq 9 -1 $n`;do \
      if [ $m -ne $n ];then echo "file$n file$m";fi; \
    done; \
  done | sort -n
file1 file2
file1 file3
file1 file4
file1 file5
file1 file6
file1 file7
file1 file8
file1 file9
file2 file3
file2 file4
file2 file5
file2 file6
file2 file7
file2 file8
file2 file9
file3 file4
file3 file5
file3 file6
file3 file7
file3 file8
file3 file9
file4 file5
file4 file6
file4 file7
file4 file8
file4 file9
file5 file6
file5 file7
file5 file8
file5 file9
file6 file7
file6 file8
file6 file9
file7 file8
file7 file9
file8 file9

Q8. 0から999999までの数字の一様乱数を無限に出力し続けてください。

■awkは桁揃えのために。

$ while true;do \
    dd if=/dev/urandom count=10 bs=512 2>/dev/null | \
      tr -d -c '0-9' | cut -c 1-6 | \
    awk '{printf "%6d\n",$0}'; \
   done
276993
750541
780016
 84374
894990
780357
136490
...