Created
July 16, 2011 13:04
-
-
Save fumiyas/1086344 to your computer and use it in GitHub Desktop.
UPS友の会: シェルスクリプト大喜利第二回: 第2問: interlace コマンド
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
#!/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