トップページunix
1001コメント327KB

シェルスクリプト総合 その9

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。2007/08/15(水) 07:25:02
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
0835名無しさん@お腹いっぱい。2008/02/02(土) 16:23:08
仕様というか、文法的には、$@ は、0個の場合も含む位置パラメータに展開される
特殊パラメータとして定義されている。
この定義は、たとえ位置パラメータの個数が0個の場合でも変わらない
(=未定義にはならない)ので、
$@は、位置パラメータの個数が0個の場合でも定義されていると考えられる。
よって、set -u 状態での $@ の参照を、
「未定義パラメータの参照」とみなしてしまう一部のシェルの実装は
バグと考えて良い。
0836名無しさん@お腹いっぱい。2008/02/02(土) 16:25:45
>>832
冗長な記述を否定するために、より冗長な記述を持ってきても説得力ないぞ。
しかも戻すために処理後にset -u必要だし。
いや、nounsetが設定されていることを確認しないといかんな。

if set -o | egrep 'nounset *on' >/dev/null 2>&1; then
set +u
hoge "$@"
set -u
else
hoge "$@"
fi
こうか? www

>>833
噴飯物の社内標準がなければ${1+"$@"}と書いても5文字増えるだけだ。

>>834
お前がやれ。理由は「社内標準が守れないから」とでもしとけ。www
0837名無しさん@お腹いっぱい。2008/02/02(土) 16:33:04
$@ に限らず、$# $! $? などの「特殊」パラメータはすべて unsetできない。
unsetできるのはシェル変数だけ。
それとは別に、「位置」パラーメータは未設定の場合もあり得る。

そして、$@は、「位置」パラーメータではなく
「特殊(←ここ重要)」パラメータであるということ。

set -u はそもそもシェル変数や「位置」パラーメータのように、
未設定である場合があり得るパラメータに対してチェックするためのもの。
その set -u が、「特殊」パラメータである $@ に反応してしまうのはおかしい。
0838名無しさん@お腹いっぱい。2008/02/02(土) 16:35:51
>>837
いや、その説明だと、特殊パラメータの $! は、バックグラウンド起動歴が
なければ未設定になるから、説明にならない。

>>835 の説明の方が正しいんじゃないか?
0839名無しさん@お腹いっぱい。2008/02/02(土) 16:39:38
うん、じゃあ。その説を世界中のシェル開発者に納得させて全部修正させてから。
↓こう主張してね。
> あと、引数が0の場合であっても現行のシェルなら "$@" ですべてOK。
> ${1+"$@"} という書き方はもう古いので、そろそろ撲滅すべし。
0840名無しさん@お腹いっぱい。2008/02/03(日) 04:03:25
${1+"$@"} としなくても済む環境ならそれでいいだろうけど
ウチでは set -u 必須としてて環境的に ${1+"$@"} せざるを得ないんで

> 結論: ${1+"$@"} は不要

と言われても全然結論じゃないんだけどな "$@"にしたら問題起きるんで書き直しだし

まぁ言語仕様的には "$@" で問題起きない方が正しいのかもしれんが
シェル開発者や仕様企画者の集まりっていうならともかく
元々伝統的な方法でもあるんで必死こいて ${1+"$@"} を否定する意味が分からない
0841名無しさん@お腹いっぱい。2008/02/03(日) 07:40:37
>>840
set -u 必須ってどんな環境?

俺の認識では、set -u はあくまでデバッグ用であって、
本番スクリプトでset -uを記述するなんてあり得ないんだけどな。

で、set -u必須だったとして、例えば、あるオプション変数がセットされてれば
使うけど、セットされてなければ黙って無視したいような場合、

hoge_command $HOGE_OPT

って書いちゃ駄目なんだよね? (不便だな)
いちいち
hoge ${HOGE_OPT+HOGE_OPT}

って書くのかなw
0842名無しさん@お腹いっぱい。2008/02/03(日) 08:20:12
>>841
hoge ${HOGE_OPT+HOGE_OPT}
わらた
タイプミスで初期化してない変数を見てしまうバグが未然に防げる可能性があるだろ
0843名無しさん@お腹いっぱい。2008/02/03(日) 08:42:59
>>842
つねに ${HOGE_OPT+$HOGE_OPT} って書かなければならないルールになっちゃうから、

${HOGE_OPT+$HOGE_ORT} っていうタイプミスすると防げない。
0844名無しさん@お腹いっぱい。2008/02/03(日) 08:58:04
>843 中身がないときはifでよけて書けばいいんじゃね?
0845名無しさん@お腹いっぱい。2008/02/03(日) 08:59:22
>>844
中身がないかどうかを set -u の状態で ifで判定ってできる?
0846名無しさん@お腹いっぱい。2008/02/03(日) 09:09:30
空文字列か何かで初期化?
0847名無しさん@お腹いっぱい。2008/02/03(日) 09:16:38
>>846
シェルスクリプト内部で定義する変数なら最初空文字列で初期化でいいけど、
起動時に環境変数で渡される変数だと、
結局セットされてるかどうかの判定が必要になるからあまり意味ないね
0848名無しさん@お腹いっぱい。2008/02/03(日) 09:25:25
set -u 環境では、
if [ -n "$HOGE" ]; then
みたいなよくやる書き方もできないわけだ。

いちいち
if [ -n "${HOGE+$HOGE}" ]; then
って書くのかな?

あるいは最初にいちいち
: ${HOGE=}
とかするのかな。いずれにしても不便だなw
0849名無しさん@お腹いっぱい。2008/02/03(日) 09:30:58
>>848
[ -n "${HOGE+$HOGE}" ]
なんてしなくても、
[ -n "${HOGE-}" ]
で十分。

ところが、いつも${HOGE-}する癖がつくと結局 set -u の意味がなくなる。

rm -i をaliasしても無意味なのと似てる。
0850名無しさん@お腹いっぱい。2008/02/03(日) 09:46:07
>>829
俺は意味は分かるし、見かけたこともあるが、
なぜそんな冗長な書き方をしていたのかは
今の流れで初めて分かった。

で、set -u のバグがあるのは FreeBSD だけ?
0851名無しさん@お腹いっぱい。2008/02/03(日) 11:13:41
>>849

素人さんにプロのテクニックを教えてやろう。
set -uはタイプミスを検出するために使うんだよ。全ての変数は明示的に初期化する。
従って未定義の変数はタイプミスだ。
0852名無しさん@お腹いっぱい。2008/02/03(日) 11:49:24
>>851
なるほど。
一つ賢くなった気がする。
0853名無しさん@お腹いっぱい。2008/02/03(日) 11:55:26
>>851
その説明だと、未定義の場合もアリのスクリプトが書けない。
変数を他から引き継ぐ場合、初期化するわけにもいかない。
定義済みかどうかの判定がどこかで必要になる。
で、定義済みかどうかの判定自体が set -u に引っかかるから、
>>849 が指摘してるように冗長な記述が必要になる。
そこまで代償を払って set -u する必要もなかろう。
0854名無しさん@お腹いっぱい。2008/02/03(日) 12:09:06
>>853
> 変数を他から引き継ぐ場合、初期化するわけにもいかない。
> で、定義済みかどうかの判定自体が set -u に引っかかるから、
未定義ならば代入という記法があるので問題ない。(何度も出ているが${parameter=word})
いい加減に負け認めて引っ込みなよ。見苦しい。

>>810 位置パラメータを用いた別解をだす。
>>811 ${1+"$@"}という記法に因縁つける。
>>810 反論のついでに「お前のプログラムってバグだらけだろう。」と煽る。>>812
>>811 必死の再反論を試みるが迎撃され、逃亡。
>>811 噴飯物の社内標準を持ち出すも撃破される。
>>811 ムキになって反論するも、無知をさらけ出す結果に陥る。 <=== 今ココ
0855名無しさん@お腹いっぱい。2008/02/03(日) 12:10:30
>>854
>未定義ならば代入という記法があるので問題ない。

だから、その記述が冗長といってるんじゃないかw
0856名無しさん@お腹いっぱい。2008/02/03(日) 12:16:23
>>855
全ての変数は初期化するといってるだろ。
これが冗長だというならperlでも冗長だからuse strictしてないんだろうな。
「お前のプログラムってバグだらけだろう。」 www
0857名無しさん@お腹いっぱい。2008/02/03(日) 12:17:16
宗教論争の様相を呈してまいりました.
つうわけでアンケート.

変数は使うときまで宣言しない派?最初に宣言しとく派?
0858名無しさん@お腹いっぱい。2008/02/03(日) 12:20:39
シェルスクリプトは、あらかじめ変数宣言しないでも
その場ですぐ使えるのがメリットだろ。
堅苦しく変数宣言必須にするならメリット半減だな。
0859名無しさん@お腹いっぱい。2008/02/03(日) 12:21:08
そのアンケートは的外れ。
0860名無しさん@お腹いっぱい。2008/02/03(日) 12:28:27
シェルスクリプトで変数宣言するのは
関数のローカル変数を設定する時ぐらいだな。
0861名無しさん@お腹いっぱい。2008/02/03(日) 12:28:45
set -u 派の人って、#!/bin/sh -u で記述してるの?
それとも本文に set -u 入れてるの?
あまり見かけないけど
0862名無しさん@お腹いっぱい。2008/02/03(日) 12:33:57
>>858
キミのしょぼいスクリプトを基準に語られても困る。
0863名無しさん@お腹いっぱい。2008/02/03(日) 12:36:43
例外?何それみたいな使い捨てスクリプトも書けるし
ずっと使っていくようなものも書ける
その幅の広さがシェルスクリプトのいいところじゃね?
0864名無しさん@お腹いっぱい。2008/02/03(日) 13:47:22
横槍だが、そもそも${1+"$@"}がどういう意味なのか
わからないから、なぜそう書くのか理解できない。
0865名無しさん@お腹いっぱい。2008/02/03(日) 13:57:57
${parameter+word}という記法はparameterがセットされている場合はwordに展開される。
なので、${1+"$@"}は位置パラメーター$1がセットされていると"$@"に展開される。
08668642008/02/03(日) 14:51:45
>>865
ありがとう。manには:+しかなかったから別物だと思った。
見なおしたら"If the colon ( :) is omitted〜"って文があった。
www.cs.princeton.edu/~jlk/kornshell/doc/man88.html
0867名無しさん@お腹いっぱい。2008/02/04(月) 21:43:38
>>811 ほら調べてやったぞ。SUSE 9, Redhat 4, Solaris10, Service for UNIX 3.5
警告でないのはRedhat 4のashだけだ。FreeBSD 8も合わせてバグ報告しとけ。www
★SUSE LINUX Enterprise Server 9 (x86_64) p3
$ /bin/ash -cu 'echo "$@"'
/bin/ash: @: parameter not set
$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
★Redhat 4 u5
$ /bin/ash -cu 'echo "$@"'

$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
★Solaris10 8/07
$ /bin/sh -cu 'echo "$@"'
/bin/sh: @: parameter not set
$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
$ /usr/xpg4/bin/sh -cu 'echo "$@"'
/usr/xpg4/bin/sh: @: parameter not set
★SFU(Service for UNIX) 3.5
$ /bin/sh -cu 'echo "$@"'
/bin/sh: @: parameter not set
$ /bin/ksh -cu 'echo "$@"'
/bin/ksh: @: parameter not set
0868名無しさん@お腹いっぱい。2008/02/04(月) 21:46:31
>>867
もはやこれは愛だな
0869名無しさん@お腹いっぱい。2008/02/04(月) 22:03:43
Kシェルスクリプトについての質問です。

file1に入っている文字を、file2の中で検索し、あればエラーなしという
スクリプトを書きたいのですが、どなたかご教授願えないでしょうか?

file1には以下のような文字が200行程度、入っています。
aaa 12345678
bbb 12345678
ccc 12345678

file2には以下のような文字が300行程度入っております。
aaa 09876543
bbb 09876543
ccc 09876543
ddd 09876543

このfile1に入っている頭3文字の行全てを、file2の頭3文字にあるかないか、
といったスクリプトを書きたいのですが、シェルの基本程度しかしらず
悪戦苦闘をしております。なにとぞ、ご教授願いますよう、お願いします。
0870名無しさん@お腹いっぱい。2008/02/04(月) 22:11:16
>>869
kshじゃなくても、普通のshで書けるね。


#!/bin/sh

while read key other
do
if grep -q $key file2; then
echo "$key は file2にある"
else
echo "$key は file2にない"
fi
done < file1
08718692008/02/04(月) 22:16:58
Kシェルが社内標準になっちゃったんです…
さらに運悪くジョブ管理までやらされるはめに。
ご迷惑をおかけしますが、何卒よろしくお願いします
0872名無しさん@お腹いっぱい。2008/02/04(月) 22:17:48
kshは下位互換性ないの?
0873名無しさん@お腹いっぱい。2008/02/04(月) 22:18:56
>>871
だったら #!/bin/ksh って書けばいいだけだよ。

あと、grep -q $key は grep -q "^$key" の方がいいかな。
0874名無しさん@お腹いっぱい。2008/02/04(月) 22:19:52
shでできることは、ほぼそのまま変更せずにkshでもできる。
08758692008/02/04(月) 22:20:57
>>872
あるんですが、今後はKシェルで書けとの命令が上から下りまして…
0876名無しさん@お腹いっぱい。2008/02/04(月) 22:24:19
>>875
こいつ、ネタか?
この場合、kshで書いても shと全く同じものになるんだよ。

それとも、何か最低限 ksh専用の文法を使わなけりゃいかんのかよ?
08778692008/02/04(月) 22:32:56
皆様、ありがとうございます。
丁寧に答えてくださり、まことに感謝しております。

>>876
何分Kshの事を全然知らなくて…
Goto文が書けないやら、色々戸惑っている最中です。
もし何かまたわからない事がありましたら、ご質問させていただきます。

今回は本当にありがとうございました。
0878名無しさん@お腹いっぱい。2008/02/04(月) 22:41:33
横レスで便乗質問です。
偶然ですが、>>870 と同じようなスクリプトを書くために悪銭苦闘しています。
とりあえず /bin/shでではできたんですが、
今後はbashシェルで書けとの命令が上から下りまして…
>>870 をbashシェルで書くとどのようになりますでしょうか、ご教授ください。
なお、#!/bin/shを#!/bin/bashに変えただけでは却下され、
何か最低限bashシェル専用の文法を使わなければ上司が納得してくれません。
0879名無しさん@お腹いっぱい。2008/02/04(月) 23:26:50
あっそ
0880名無しさん@お腹いっぱい。2008/02/04(月) 23:44:18
>>878
なぜsh互換ではNGでbash専用でないとダメなのか
その上司を問いつめて、結果をこのスレに書き込んでみ?
0881名無しさん@お腹いっぱい。2008/02/05(火) 00:49:39
おれのエスパー予想では、話題を変えようとしている>>811の涙目自演。
0882名無しさん@お腹いっぱい。2008/02/05(火) 02:11:40
>>878
まず
ttp://search.luky.org/linux-users.9/msg06102.html
とか嫁
0883名無しさん@お腹いっぱい。2008/02/05(火) 02:30:35
>>878
test とか [ を [[ 記法にでも変えたら?
0884名無しさん@お腹いっぱい。2008/02/05(火) 03:10:05
ttp://www.nicovideo.jp/watch/sm2217336
うっう〜
0885名無しさん@お腹いっぱい。2008/02/05(火) 07:15:24
>>883
testも[もないんだが、>>870 には。
0886名無しさん@お腹いっぱい。2008/02/05(火) 09:47:50
その気になればいくらでも変態的記法で書き換えられるぞ。w
こんなの趣味でも書かないけどな。w

#!/bin/bash

while read line
do
 grep "${line:0:3}" file2 &> /dev/null
 if $[ $? == 0 ] ; then
  echo "$key は file2にある"
 else
  echo "$key は file2にない"
 fi
done <<< "$( < file1 )"
0887名無しさん@お腹いっぱい。2008/02/05(火) 09:49:48
あ、間違えた。
けど、こんなの使わないからいいか。w
0888名無しさん@お腹いっぱい。2008/02/05(火) 10:19:41
互換性がなかったらシェルスクリプトの良さの3割を失なってると思うんだ…
0889名無しさん@お腹いっぱい。2008/02/05(火) 10:33:29
そうでもないよ。
0890名無しさん@お腹いっぱい。2008/02/05(火) 10:56:19
むしろ使い捨ての方が圧倒的に多いよなw
他の環境どころか、明日はもう動かなくていいやつとか。
0891名無しさん@お腹いっぱい。2008/02/05(火) 12:31:07
0892名無しさん@お腹いっぱい。2008/02/06(水) 13:18:18
$ find $HOGE -not -regex ".*#.*" -not -name "*~" -not -name "*svn*" -name "*.[ch]*"
のようなものの-not -regex ".*#.*" -not -name "*~" -not -name "*svn*"の部分だけを再利用したいんですが
ignore_backup="-not -regex \".*#.*\" -not -name \"*~\" -not -name \"*svn*\""
のようにして
$ find $FOO $ignore_backup -name "*.el"
としてもうまくフィルタリングしてくれないようです
何が良い方法はありませんか?
0893名無しさん@お腹いっぱい。2008/02/06(水) 13:33:03
evalれば?
0894名無しさん@お腹いっぱい。2008/02/06(水) 14:01:27
\"取るとか
0895名無しさん@お腹いっぱい。2008/02/06(水) 14:10:12
アドバイスありがとうございました。
evalすると言う手でなんとかしました
zsh,bashでしか確認してませんがとりあえずこんな感じでいけました
この方針なら内部で他の変数を参照する予定の無い文字列はsingle quoteにした方がよさそうですね
# dot files
ignore_bkup='-type f -not -regex ".*#.*" -not -name "*~"'
eval "$find $HOME -maxdepth 1 $ignore_bkup -regex '.*\/\..*'"
0896名無しさん@お腹いっぱい。2008/02/06(水) 14:19:36
普段は ' で、展開したい時だけ "
0897名無しさん@お腹いっぱい。2008/02/06(水) 19:47:26
質問があるのですが、
引数にlistという文字列がある場合には、lsコマンドを実行する
これを実行するにはどういう構文をつくればいいのでしょうか?
0898名無しさん@お腹いっぱい。2008/02/06(水) 20:05:04
>>897
for arg in "$@"
do
case $arg in
list)
ls;;
esac
done
0899名無しさん@お腹いっぱい。2008/02/06(水) 20:22:09
>>898
ありがとうございます
0900名無しさん@お腹いっぱい。2008/02/06(水) 23:46:40
>>898
$args → "$args"
0901名無しさん@お腹いっぱい。2008/02/06(水) 23:47:18
>>900
お前馬鹿だろ
0902名無しさん@お腹いっぱい。2008/02/07(木) 00:30:09
>>878
> 何か最低限bashシェル専用の文法を使わなければ上司が納得してくれません。

お前に必要なのは不要な文法ではなくて新しい職。
0903名無しさん@お腹いっぱい。2008/02/07(木) 04:59:08
902と意味するところは多分違うが表面的には同意。
0904名無しさん@お腹いっぱい。2008/02/07(木) 09:35:36
(1)
$ echo .string | sed -e s/^\\\\.//
.string

(2)
$ AAA=.string
$ BBB=
$ BBB=`echo "$AAA" | sed -e s/^\\\\.//`
$ echo $BBB
string


(1)(2)で結果が違ってくるのですがこれはなぜでしょうか。
0905名無しさん@お腹いっぱい。2008/02/07(木) 09:48:23
`〜`
を使っているから。
0906名無しさん@お腹いっぱい。2008/02/07(木) 09:49:18
BBB=`echo "$AAA" | sed -e 's/^\\\\.//'`
0907名無しさん@お腹いっぱい。2008/02/07(木) 09:55:55
BBB=`echo "$AAA" | sed -e s/^\\\\\\\\.//`
0908名無しさん@お腹いっぱい。2008/02/09(土) 01:16:11
BBB=`echo "$AAA" | sed -e s/^\\\\\\\\\\\\.//`
0909名無しさん@お腹いっぱい。2008/02/11(月) 14:50:12
すみません。
unixのwc -lコマンドと同等のものを
perlやawkの一行野郎にしたいのですがうまくいきません

perl -ne 'while (<>) { print cnt}' file1
お願いします
0910名無しさん@お腹いっぱい。2008/02/11(月) 14:55:30
一行野郎ってなに?
0911名無しさん@お腹いっぱい。2008/02/11(月) 14:58:34
ワンライナーのことか。
awk使いたいだけなら、
cat file1 | cat -n | tail -1 | awk '{print $1}'
でいいじゃん。
0912名無しさん@お腹いっぱい。2008/02/11(月) 15:00:28
>>911 アフォか。無駄過ぎ。いろんな意味で。
0913名無しさん@お腹いっぱい。2008/02/11(月) 15:03:27
無駄ってのは
cat file | cat -n
ってところかい?
それは最初のcatは、catじゃなくても他の部分から取れるようにしてるのだが。
0914名無しさん@お腹いっぱい。2008/02/11(月) 15:03:40
>>909
awk 'END{print NR}' file
0915名無しさん@お腹いっぱい。2008/02/11(月) 15:04:54
>>913
無駄ってのは、>>914 でできるのにわざと冗長な方法を書いていること。
0916名無しさん@お腹いっぱい。2008/02/11(月) 15:05:56
>>909をみてる感じでは、一行づつ数えたいんだと理解したのだが…。
0917名無しさん@お腹いっぱい。2008/02/11(月) 15:08:23
wc -lは複数ファイルを引数に与えられるが、そこまで同等なのか、標準入力だけでよいのか。
要求をはっきりしたまえ。

もっとも、↓これなら完璧だが。
perl -e 'exec "wc", "-l", @ARGV'
0918名無しさん@お腹いっぱい。2008/02/11(月) 15:09:44
そんなことより、>>909がなぜ行数を数えて出力できると思ったのか
みんなで考察してみようぜ。

まず、どこから急にcntが出て来たのか。
0919名無しさん@お腹いっぱい。2008/02/11(月) 15:11:25
一つのファイルだとも複数のファイルだともストリームからだとも言ってないんだから、
>>911でいいじゃないか。
思い付いたようにシンプルに済ませるのがShellScriptでしょ。
0920名無しさん@お腹いっぱい。2008/02/11(月) 15:12:23
すみません。909です。
サーバ環境のコードに合わない文字コードのファイルだと
wcコマンド使えないので他に代用したいというのが背景です。

目的はファイルの行数を単にカウントするだけです。
0921名無しさん@お腹いっぱい。2008/02/11(月) 15:18:32
何言っちゃってんの?
0922名無しさん@お腹いっぱい。2008/02/11(月) 15:28:57
と、>914さんの方法で解決できました!
みなさんありがとうございました
0923名無しさん@お腹いっぱい。2008/02/11(月) 16:58:29
やっぱり >>911 はアフォだったね。

awkなら、>>914 が解として最善だが、wcの文字コードの問題なら、
LANG=C LC_ALL=C wc -l
としても解決できるはず。
0924名無しさん@お腹いっぱい。2008/02/11(月) 17:11:58
阿呆とは思わんけど、ちゃんと情報を聞いてから答えるべきだったね。
それは>>914もそうだが。
0925名無しさん@お腹いっぱい。2008/02/11(月) 17:23:15
>>924
そんな必要ない。最初の質問情報だけで最適解を出すのが良い。
それで求めているものと違っているなら質問者が再度質問してくるだけだから。
それより問題なのは、最適解を知らないくせに質問者に追加情報だけ出せという奴。
(で、たいてい追加情報が出てきても最適解を答えられないw)
0926名無しさん@お腹いっぱい。2008/02/11(月) 17:41:27
>>925 == >>914か?
もし複数のファイルを対象にしたいとか>>914の解とは違ってたら、情報を小出
しにするなとか言い出すんだろうなw

まぁ、そんなことより追加情報が出る度に解を出して良くってのはものすごい
効率が悪いな。 最初に情報を聞き出してから普通は何かを作るだろ。
仕様が不十分なままにコード書き始めて、途中で仕様がひっくり返ったら全部
作り直しだろ。
0927名無しさん@お腹いっぱい。2008/02/11(月) 17:41:00
>>925
そのとおりだ
0928名無しさん@お腹いっぱい。2008/02/11(月) 17:45:28
ぐだぐだ言わずにとりあえずコード書けってこと?
0929名無しさん@お腹いっぱい。2008/02/11(月) 17:48:56
>>925は自分の解が最適だと思ってるのか:-)
適してるならまだしも、最適って。
別に>>911でも解としては間違ってないわけで、
なんでそんなに自分の解に自信を持ってるのかと。
0930名無しさん@お腹いっぱい。2008/02/11(月) 17:54:51
逆に、質問を変えて >>911 の解が最適になるようにしようとしてもできない。
awkを使うなら、cat -nだけでなくtail -1の機能もawk側でできるから、
わざわざ多段パイプにするのが無駄。
逆に、cat -n|tail -1にするなら、最後までawkを使わずに処理するべき。(cutとかで)
09319112008/02/11(月) 17:55:43
なんか騒いでるみたいだけど…。

perl -e 'while(<>){} print "$.\n"' file1
行数数えるだけならこうかな。

最適っていうなら、「Perlやawk」でって言ってるんだから、Perlでの最適な答えも出して上げれば良いのに。
もちろん、上の解が最適だとは思わないけどね。
他にもやり方は色々あるし、毎行処理してる時点で最適ではないし。
(awk {END}もそうだけど。)
09329112008/02/11(月) 17:56:59
>>930
awkを使って。 って書いてあるから、awkを使っただけなんだけど…。
awkはあんまり使わんから、とりあえずできればって思っただけなんだけど。
まぁ、自分はそんなに自信があって言ったわけじゃないからねスマンね。
0933名無しさん@お腹いっぱい。2008/02/11(月) 18:04:11
確かに無駄に毎行処理するのは(>>914は最後のみ実行だが、それまでも内部処理される)よろしくないな。
>>914 最適な解を望む。 最適な解だぞ。
0934名無しさん@お腹いっぱい。2008/02/11(月) 18:07:05
>>932
だから、awkを使ってっていってるのに、
なんで awk側でできる cat -n や tail -1 相当の処理を
awk側でやらないのかってこと。

>>930 の最後の行で言ってる、「最後までawkを使わずに処理するべき」ってのは、
「cat -n | tail -1」を使う以上は、ってこと。
で、それだと「awkを使う」という質問に適合しないから、
>>911 は解にならないと言いたいわけ。
レス数が900を超えています。1000を超えると表示できなくなるよ。