Skip to content

Instantly share code, notes, and snippets.

@fumiyas
Created July 16, 2011 13:04
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 fumiyas/1086344 to your computer and use it in GitHub Desktop.
Save fumiyas/1086344 to your computer and use it in GitHub Desktop.
UPS友の会: シェルスクリプト大喜利第二回: 第2問: interlace コマンド
#!/bin/bash
#!/bin/ksh でも可 (ただし制限あり)
##
## UPS友の会: シェルスクリプト大喜利第二回
##
## [第2問] 本誌6ページに出てきたinterlaceコマンドをシェルスクリプトで
## 書いてください。8つのストリームを重畳する専用で構いません。
## ======================================================================
## これはそこそこ歯ごたえあるお題だと思います。投稿したら段位をたくさん進
## 呈する可能性が高いです、たぶん。(歯ごたえあると思いますので、全然解答が
## よせられなかったらどーしよう、とちょっと心配でもあります)
##
## 「本誌6ページのinterlaceコマンド」がやることをわかりやすく解説します。
##
## 4行からなるファイルが8つ(a.txt〜h.txt)あり、内容は次のとおりだったとし
## ます。
##
## 行番号 a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt
## ----- ----- ----- ----- ----- ----- ----- -----
## 1 11111 aaaaa AAAAA !!!!! awk sh akiba hare
## 2 22222 bbbbb BBBBB """"" sed bash osu kumori
## 3 33333 ccccc CCCCC ##### grep tcsh pombash ame
## 4 44444 ddddd DDDDD $$$$$ tr zsh tenjin yuki
##
## この8つのファイルに対して
##
## interlace a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt
##
## というコマンドを実行した場合、標準出力に次の結果が出れば合格です。
##
## 11111
## aaaaa
## AAAAA
## !!!!!
## awk
## sh
## akiba
## hare
## 22222
## bbbbb
## BBBBB
## """""
## : ←長いので省略
## zsh
## tenjin
## yuki
##
## これを、なるべくスマートに実行するスクリプトを書いてください。
## FIXME: ksh, zsh だと fd >= 10 な場合に動かない…。
set -u
fd_start="3"
fd_max="$fd_start"
for f in "$@"; do
eval "exec $fd_max<\"\$f\""
let fd_max++
done
while :; do
fd="$fd_start"
read=
while [ $fd -lt $fd_max ]; do
if eval "read -r line <&$fd"; then
read="set"
echo "$line"
## zsh の場合は以下に変更:
#print -r "$line"
fi
let fd++
done
[ -z "$read" ] && break
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment