952 :
945:2008/02/11(月) 18:52:59
tmp]$ dd if=/dev/random bs=1024k count=1 > tmp_r
tmp]$ cat tmp_r | LANG=C wc -l
0
tmp]$ cat tmp_r | perl -e 'while(<>){} print "$.\n"'
1
tmp]$ cat tmp_r | awk 'END{print NR}'
1
tmp]$ cat tmp_r | perl -lne 'END{print$.}'
1
ものすごい影響されてるが…。
以降、
>>945 がいつまで自分の無知をさらけだすか見守りたいと思います。
>>952 ワロタwwwwww
>>951は自分の発言すら試してなかったのか?w
それともたまたまうまくいっただけか
>>952 では別の問題が発生してるみたいだね。
/dev/randomじゃなくて /dev/urandomでやるべき。
/dev/randomを ddで吸い出すと、十分なエントロピーがなくて
ほとんどがゼロで埋まってるものと思われ。
それとは別に、wc -lでは、最後の改行がない行を数えないが、
awk 'END{print NR}'では数えるから、行数が1ずれる。
その点は、
>>945 が最初指摘していたコントロールコードの問題とは違うので、
勘違いしないように。
>>952 だいたい、1MBも乱数で取ったのに '\n' が1つしかない時点で
その実験自体がおかしいことに気づけww 乱数になってない。
952の人気はすばらしい
乱数なんだから1個でどこがおかしいんだよ。
しかもファイルがおかしいにしても、今回はwcが扱えないことはわかったでしょ。
改行コード(\n) = 1行
ということなら、この場合やはり LANG=C wc -l の計数表示が正しいということになる。
awk 'END{print NR}' では、最後の不完全な行までカウントしてしまう。
そういう意味で、やはり LANG=C wc -l が最適ということになるな。
実験してみた。
$ echo -n a > file
$ LANG=C wc -l < file
0
$ awk 'END{print NR}' < file
1
ということだ。LANG=C wc -l の方が正しいな。
では、
>>914は自信満々だったけど正しくなかったのか。
最適とか言ってたのに残念。
>>961 >>914 は wcを使わないという時点では最適だろ。
で、あとでwcを使わなかった理由が質問者から示されたから、
それならLANG=Cでということで、wcが最適になっただけのこと。
定義問題だな
wcのmanではああなっているから
では、結局新しい情報がでてきてもそれに答えられなかった
>>914は最適じゃないでしょ。
次々に新しい解を出すのが
>>914の言う最適な解なんだから。
最適最適って言ってるけどさ,最適ってどういうこと?タイプ数が最小なものってこと?
いいからそろそろ次スレよろ
立ててきます
このスレでダメだという指摘が出来ないものが最適。
なんかいいスレだな。wktk
というか、awkはスレ違い。
シェルならシェルだけでやれ。
シェルだけでやる場合の最適解
↓
n=0; while read dummy; do ((n++)); done < file ; echo $n
じゃあこれでどう?
シェルだけということで、exprすら使わないようにしたよ
set --; while read dummy; do set "$@" a; done < file ; echo $#
>>977 set -- はシェル実装依存。shift $# の方が確実だな。
/bin/sh
だけでできるようにしてくれや。
祭りに乗り遅れた。。
読むたびに位置パラメータ(知らなければコマンドライン引数みたいなものと思え)
にaという文字を追加。
最後に位置パラメータの「個数」(=aを追加した回数=行数)を表示。
>>977 行末に \ がある行があると計数ミスするなぁ
というか、wc (オプションなし)だと確かに LANG=C以外の時エラーが出るが、
wc -l とか wc -c だと、そもそも単語に分ける必要ないから文字コードも見ないし、
LANG=C にする必要ないぞ。
wc -l オプション付けてるのに LANG=C が必要なのって、どこの wcコマンド?
>>977 それ、1万行とか10万行とかあってもちゃんと動作するんだろうか?
というか、$#の上限ってどこかで決まってるんだろうか?
とりあえず上限調べて、予想するとかソース読むとか
ボーンでは9が上限
${10}
>>989 だからぁ、ボーンでは ${10} は使えないんだよ。
>>989 $ /bin/sh
$ uname -sr
SunOS 5.10
$ echo ${10}
bad substitution
知らないくせに余計な突っ込みするなよw
shiftしても引数を9個以上とれないってこと!?
shiftすれば行けるだろ。${10}は行けないけど。
ash 0.3.8で
while :; do
set -- "${@}" a
echo $#
done
の出力が15000越えるところまでは見た。
これ以上元祖に近いシェルは手元にないので勘弁。
別に$10とかに直接アクセスできる必要はないんだよな。
たしかに$1から$9をとばして$10だけが必要になる場面が想像できない
俺は極端には$1とshiftだけでもやっていけるな
位置パラメータをコマンド引数として解釈する場合は ${10}とか要らないが、
set を配列代わりに使う用法では、${10}以上の要素に直接アクセスできないとな。
でも、結局Bourneでは使えない方法だから用途は限られる。
今回は数を数えるためだけに使ってるからいいよね。
行カウントコードの別案出してみる:
$ (IFS='
> '; IFS= set -- `cat foo`; echo $#)
どんな状況でも機能するのかはちょっとあれだが・・・
h
1000ならジュースでも飲むか
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。