[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 21:40 / Filesize : 275 KB / Number-of Response : 969
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合@LINUX Part3



1 名前:login:Penguin [2007/07/10(火) 23:17:13 ID:qGthZdME]
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

【sed】シェルスクリプト総合@LINUX Part2【awk】
pc11.2ch.net/test/read.cgi/linux/1154578200/
pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。


641 名前:login:Penguin mailto:sage [2008/02/20(水) 04:33:00 ID:H+YlTABW]
君も頭悪いな。
639は高速で、と書いてあるんだから、「速度を問わなければ」人間が…と
読むのが妥当という答にしかならないぞ。
どうせそういう突っ込みするなら空間計算量でやればよかったのに。

642 名前:login:Penguin mailto:sage [2008/02/20(水) 07:24:32 ID:kPfB9gdm]
理論ばっかりのたまって生産性の無い人ってよくいるよね。

643 名前:login:Penguin mailto:sage [2008/02/20(水) 08:22:42 ID:TBsfl6zQ]
まとめ。

Q) シェルスクリプトを覚えるとなにが出来るようになるんですか?
A) 理論ばっかりのたまって生産性の無い人ってよくいるよね。

644 名前:login:Penguin mailto:sage [2008/02/20(水) 09:09:29 ID:s2YtVBn2]
>>632
シェルスクリプトでやりたいと思ったこと。

645 名前:login:Penguin mailto:sage [2008/02/20(水) 10:22:00 ID:0BB6Gw/L]
俺は…彼女にパイズリして欲しいな…。
乳はAAだけど orz

646 名前:login:Penguin mailto:sage [2008/02/20(水) 10:22:28 ID:0BB6Gw/L]
>>645
誤爆った。正直スマンかった。

647 名前:login:Penguin mailto:sage [2008/02/20(水) 10:47:15 ID:VHJ6cFjQ]
>>645
基本的に彼女ができないことなのでシェルスクリプトでもできません。

648 名前:login:Penguin mailto:sage [2008/02/20(水) 11:22:35 ID:eOYCs3Nz]
>>647
AAでもいいということなので,アスキーアートでおっぱいを表現することならシェルスクリプトで可能です
さらに最近のターミナルエミュレーターはアンチエイリアスがきいてるのでなめらかですよ

649 名前:login:Penguin mailto:sage [2008/02/20(水) 11:31:04 ID:Z0UaqwNw]
すごいな。>>641は地球の裏側に手紙を届けたりなんてことが「ゆっくりならできる」そうだ。
できるというなら精々一生をかけて歩いて船をこいで手紙を届けにいって、それを証明してほしいものだ。
コンピュータという人間が使うモノが、人間以上の方法(アルゴリズムなどの知性)を知らないのは当然のことだが
最近ではその知性すら、コンピュータを使ったシミュレーション解析などで
得ることが増えているのが現実だったりするわけで。特に知の最先端ほどそうだ。
もはや人類はコンピュータを使わないと新しい知識を得ることすら「できない」状況なんだけどね。
そういう現実が見えない人はやっぱり自分の納得を唯一の判断基準とする文系人かな。
人間は遠くのものが見え、遠くの人と話し、より多くの知識を得、共有できるようになった。
100年前に比べたら、ほんとうに夢の魔法かコミックの世界だ。コンピュータはほんとに魔法の箱みたいじゃないか。
そのセンスは逆にあまり間違っていない気がするけどな。
「高度に進んだ科学技術はもはや魔法と見分けがつかない」アーサー・C・クラーク





650 名前:login:Penguin mailto:sage [2008/02/20(水) 12:06:00 ID:eOYCs3Nz]
>>649
日本語でおk
電報というものがあるんだが最近のゆとりは知らないのか?

651 名前:login:Penguin mailto:sage [2008/02/20(水) 12:14:29 ID:pg37fRgc]
ゆとり言いたいだけちゃうんかと

652 名前:login:Penguin mailto:sage [2008/02/20(水) 12:23:41 ID:XajlgLxx]
ネタはよそでやっとくれよ。

653 名前:login:Penguin mailto:sage [2008/02/20(水) 16:28:17 ID:vrkF+BtG]
このスレの>>640>>641の意見が興味深い。面白いな・・・。

>>648
そういうシェルスクリプト作って公開してよwwwwぜひ実行してみたい・・w

654 名前:login:Penguin mailto:sage [2008/02/20(水) 19:29:13 ID:7TuVNRao]
先日の芥川賞受賞作が>>649の文章に似てる。
句点から次の句点まで地球半周ぐらいあって、だらだらと続く感じが。
sankei.jp.msn.com/culture/academic/080116/

655 名前:login:Penguin mailto:sage [2008/02/21(木) 06:19:36 ID:FDbXS9I4]
>>649
こういう無駄な長文を書ける才能には素直に感心するよ。

656 名前:login:Penguin mailto:sage [2008/02/21(木) 12:33:09 ID:xpu03eg4]
時間を持て余してるんだろ?

657 名前:login:Penguin mailto:sage [2008/02/21(木) 18:35:15 ID:oj1Q2W6E]
ある意味うらやましい知性だ。

658 名前:login:Penguin mailto:sage [2008/02/24(日) 10:15:17 ID:RUTtO6AQ]
slコマンドってなかった?画面いっぱいにSLを表現
あれはシェルスクリプトではないから違うか・・・。

659 名前:login:Penguin mailto:sage [2008/02/24(日) 11:38:47 ID:kyu4Np6c]
>>658
つ www.tkl.iis.u-tokyo.ac.jp/~toyoda/



660 名前:login:Penguin mailto:sage [2008/02/24(日) 13:02:41 ID:FjGZZj6V]
bashです。

cdするたびに一緒にlsもして欲しいんですが、どうやって書いたらいいでしょうか?
aliasだとうまくできないです。


661 名前:login:Penguin mailto:sage [2008/02/24(日) 13:04:14 ID:UaS7yo8D]
alias cls='cd $1 && ls'

662 名前:login:Penguin mailto:sage [2008/02/24(日) 13:21:41 ID:CzUoXlF2]
clsといったらCLear Screenだろうに

663 名前:login:Penguin mailto:sage [2008/02/24(日) 13:24:30 ID:UaS7yo8D]
そうなのか。うちにはそんなコマンドないって言われたもので。

664 名前:login:Penguin mailto:sage [2008/02/24(日) 14:04:47 ID:I77Y2jQo]
そりゃDOSのコマンドだからな。

665 名前:login:Penguin mailto:sage [2008/02/24(日) 14:44:06 ID:FjGZZj6V]
>>661
できないみたいです。

カレントディレクトリが切り替わりません。


666 名前:login:Penguin mailto:sage [2008/02/24(日) 14:53:32 ID:UaS7yo8D]
>>665
うちでは動作確認したんだが・・・なんでだろね。

667 名前:login:Penguin mailto:sage [2008/02/24(日) 14:54:08 ID:UaS7yo8D]
あ、ほんとだ、切り替わらないねw

668 名前:login:Penguin mailto:sage [2008/02/24(日) 15:09:41 ID:I77Y2jQo]
PROMPT_COMMAND='if [ "$PWD" != "$PWD2" ]; then ls; PWD2="$PWD"; fi'

669 名前:login:Penguin mailto:sage [2008/02/24(日) 15:13:49 ID:uTpa9gVS]
>>667
ぢゃあ関数にしちゃうとか。
function cls {
cd $1 && ls
}



670 名前:login:Penguin mailto:sage [2008/02/24(日) 15:23:08 ID:UaS7yo8D]
cdはシェルの内部コマンドだから親プロセスには反映されないんだねえ。
#!/bin/sh
cd $1
ls
として、foo.shとして、
alias cds='. foo.sh'

かなあ。動作確認はしたw

671 名前:login:Penguin mailto:sage [2008/02/24(日) 15:36:14 ID:FjGZZj6V]
できればclsじゃなくてcdでやりたいです。

>>669,670 でcdにするとなぜか動かない。
でも参考になりました。

>>668
わかんないです。

672 名前:login:Penguin mailto:sage [2008/02/24(日) 15:41:52 ID:FjGZZj6V]
#!/bin/sh
'cd' $1
ls
として、foo.shとして、
alias cd='. foo.sh'

でできました。(・∀・)イイ!
ありがとう。

673 名前:login:Penguin mailto:sage [2008/02/24(日) 15:42:06 ID:Sa+MU/+b]
cd() {
   builtin cd $1 && ls
}

674 名前:login:Penguin mailto:sage [2008/02/24(日) 15:46:14 ID:I77Y2jQo]
( ゚д゚)……

675 名前:login:Penguin mailto:sage [2008/02/24(日) 15:47:40 ID:UaS7yo8D]
>>673
ビルトインか。やっぱりman読まないとダメだな。
ありがとう。

676 名前:login:Penguin mailto:sage [2008/02/24(日) 15:54:18 ID:l3aT8ww/]
ほう、すげっ


677 名前:login:Penguin mailto:sage [2008/02/24(日) 15:55:21 ID:FjGZZj6V]
>>673
それも(・∀・)イイ!
トン

678 名前:login:Penguin mailto:sage [2008/02/24(日) 16:08:01 ID:OZdK2Ezs]
668は逆にわかりやすいと思うが・・・なぜ分からぬ

679 名前:login:Penguin mailto:sage [2008/02/24(日) 16:57:30 ID:M1aIs9jI]
>>659
slねぇ・・・Vine 3.2だとmakeしてもエラーが出てmake出来ないんだけど・・・?
apt-get install build-essential は入ってる環境です。



680 名前:login:Penguin mailto:sage [2008/02/24(日) 21:43:32 ID:X4+soAGj]
>>679
libncurses.soのことか?

681 名前:login:Penguin mailto:sage [2008/02/24(日) 22:41:47 ID:WU8Eis2Q]
>>673
cd に -P とかオプションつけると機能しなくなるぞ。

cd() { builtin cd "$@" && ls; }

682 名前:login:Penguin mailto:sage [2008/02/24(日) 22:44:30 ID:CzUoXlF2]
>>673,>>681
それしばらく使ってみるとわかると思うけど、
そのままではナイーブすぎて少し不便だよ。

zshで同じようなことやってるけど、次の点は考慮した方がいいです。
・サブシェルで実行されたときにはlsしない
・行数が多すぎるときは適当な長さで切り、省略した旨を表示

683 名前:login:Penguin mailto:sage [2008/02/25(月) 12:48:54 ID:fTf5K0mT]
同一内容のファイルを調べるシェルスクリプトなんだけど、過去にここかUNIX板の方で出てたっぽい。
結局やらず仕舞いだったようだし、どうせならシェルスクリプトの勉強がてらやってみようとおもった。

作りたい理想は以下のとおり
 ・コマンドラインでオプション指定を行い、検索ディレクトリとサブディレクトリへの再帰検索をするかどうか、あとファイルサイズ閾値を指定できる
 ・走査しているディレクトリにあるファイルパス&ファイルサイズのペアをリストとして吐く
 ・ファイルサイズ閾値未満で、ファイルサイズが一致したものに対してmd5sumを実行し、両方が同一のハッシュを吐いた場合、表示する。
 ・ファイルサイズ閾値を設定する理由はmd5sumが時間がかかりそうだから。閾値以上のサイズ一致ファイルはmd5sumすることなく表示する。



684 名前:login:Penguin mailto:sage [2008/02/25(月) 12:52:01 ID:fTf5K0mT]
ちなみにサブディレクトリの再帰検索をせず、指定したディレクトリの全てのファイルのハッシュ値を比較して表示するだけなら

#!/bin/sh
md5sum $1/* | uniq -D --check-chars=32 | sed 's/^[0-9a-f]* \*//g'

上のだけで済むかな。標準エラーがうざいけど・・・
まずはディレクトリの再帰検索について質問したいところです。

685 名前:login:Penguin mailto:sage [2008/02/25(月) 12:55:37 ID:fTf5K0mT]
あ、uniqの間にsortを入れてあげるとより親切か
うちの場合はwgetで自動保存したファイルの整理だから、ファイル名が必然的に「DLファイル名+.連番」だから気にならないけど
まったく違うファイル名かつ内容は同一ってときに、ハッシュ値でsortしてあげていた方がいいよね
そう考えたらsedでハッシュ値をわざわざ消す必要もないか・・・

md5sum $1/* | sort | uniq -D --check-chars=32

686 名前:login:Penguin mailto:sage [2008/02/25(月) 12:57:54 ID:fTf5K0mT]
再帰検索はこの場合、find $1でファイルリストを列挙してからreadで"ls->ファイルサイズ取得"やら"md5sum"やらした方がいいのかな?

687 名前:login:Penguin mailto:sage [2008/02/25(月) 13:38:12 ID:fTf5K0mT]
不恰好だけどサブディレクトリまで調べて、全てのファイルにmd5sumして表示するのはこんな具合か・・・

#!/bin/sh
TMPFILE="filelist"
touch $TMPFILE
find $1 | while read FILENAME; do
if [ -f "$FILENAME" ]; then
md5sum "$FILENAME" >> $TMPFILE
fi
done
sort < $TMPFILE | uniq -D --check-chars=32
rm $TMPFILE

もうちょっとスマートにならないかなあ・・・ あとユニークなサイズのファイルはmd5sumさせたくないなあ

688 名前:login:Penguin mailto:sage [2008/02/25(月) 13:47:58 ID:pu40lUxS]
書いてみた。

#!/bin/sh
# finddup.sh -- find . | finddup.sh
while read -r FILENAME
do
    [ -f "$FILENAME" ] &&
        printf "%14d:%s\n" `stat -c %s "$FILENAME"` "$FILENAME"
done | sort | uniq -D -w14 | cut -b 16- |
xargs md5sum | sort | uniq -D -w32

689 名前:login:Penguin mailto:sage [2008/02/25(月) 13:53:38 ID:pu40lUxS]
uniq -f のほうが良さそうだね



690 名前:login:Penguin mailto:sage [2008/02/25(月) 13:57:12 ID:ATO0A7OZ]
>>687
find . -type f -print0 | xargs -0 md5sum | sort | uniq -D -w32

691 名前:login:Penguin mailto:sage [2008/02/25(月) 14:17:36 ID:fTf5K0mT]
>>688
ありがとう!
あ、ただファイルやディレクトリ名にスペースが入るとmd5sumにしっかり渡せないみたいです
bash on cygwin環境だとWindowsの「コピー (2) 〜 hoge.txt」という名前が恨めしい

>>690
出力結果同じだΣすげえ
ちょっとman読んでこよう・・・

692 名前:login:Penguin mailto:sage [2008/02/25(月) 14:23:38 ID:pu40lUxS]
xargs --delimiter "
" md5sum
でどうかな。ちゃんとテストしなきゃだめだね
まあ改行文字を含むファイルがあるとだめなんだけど、面倒だから他の言語でやらせたほうがいい

693 名前:login:Penguin mailto:sage [2008/02/25(月) 14:26:43 ID:ATO0A7OZ]
>>692
>>690

694 名前:login:Penguin mailto:sage [2008/02/25(月) 14:27:32 ID:pu40lUxS]
>>693
全部のファイルにmd5sumかけたら遅いだろ

695 名前:login:Penguin mailto:sage [2008/02/25(月) 14:31:42 ID:fTf5K0mT]
あ、>>688のxargs md5sumを>>690のようにxargs -0 md5sumにすればOKなのかな

696 名前:login:Penguin mailto:sage [2008/02/25(月) 14:38:34 ID:ATO0A7OZ]
>>695
んで、printf 側でも \n じゃなく \0 を使うようにする。

697 名前:login:Penguin mailto:sage [2008/02/25(月) 14:39:51 ID:pu40lUxS]
uniqとcutはどうするよ

698 名前:login:Penguin mailto:sage [2008/02/25(月) 14:43:11 ID:fTf5K0mT]
printfで囲ってやればイケました(`・ω・´)

#!/bin/sh
# finddup.sh -- ./finddup.sh target-path
find $1 | while read -r FILENAME
do
[ -f "$FILENAME" ] &&
printf "%14d:\"%s\"\n" `stat -c %s "$FILENAME"` "$FILENAME"
done | sort | uniq -D -w14 | cut -b 16- | xargs md5sum | sort | uniq -D -w32

699 名前:login:Penguin mailto:sage [2008/02/25(月) 15:21:01 ID:zYqxhFYE]
久々にまともな流れだな



700 名前:login:Penguin mailto:sage [2008/02/25(月) 16:57:52 ID:fTf5K0mT]
ついでに以下のような動きが出来ないか色々試してみています。
どうも二進も三進も行かない

$ ./findup.sh ~/pic/jun.2chan.net/

2件の一致ファイル:8f7c1e2adb45adbfdb4d86adb1b9e894--------------------------
~/jun.2chan.net/b/src/1192805081129.jpg
~/jun.2chan.net/b/src/1192805081141.jpg
-------------------------------------------------------------------------------
~/jun.2chan.net/b/src/1192805081129.jpgを削除しますか?[y/N/a]
~/jun.2chan.net/b/src/1192805081141.jpgを削除しますか?[y/N/a] y
~/jun.2chan.net/b/src/1192805081141.jpgを削除しました。

3件の一致ファイル:6fc4bdc4bc3bb06882bc98d9cbeb60c3--------------------------
~/jun.2chan.net/b/src/1192800164913.jpg
~/jun.2chan.net/b/src/1194189136460.jpg
~/jun.2chan.net/b/src/1194189137115.jpg
-------------------------------------------------------------------------------
~/jun.2chan.net/b/src/1192800164913.jpgを削除しますか?[y/N/a] y
~/jun.2chan.net/b/src/1192800164913.jpgを削除しました。
~/jun.2chan.net/b/src/1194189136460.jpgを削除しますか?[y/N/a] y
~/jun.2chan.net/b/src/1194189136460.jpgを削除しました。

↑同一として列挙されたパスの残りが1になると削除せず次へ

701 名前:login:Penguin mailto:sage [2008/02/25(月) 17:00:46 ID:ATO0A7OZ]
>>700
そこまで行くとシェルスクリプトには荷が重いんじゃないか?

702 名前:login:Penguin mailto:sage [2008/02/25(月) 17:10:48 ID:fTf5K0mT]
>>701
以下の点でハードルがあがってるみたいですね

・一致したファイルのグループ分け
・ファイルを一つだけ残して削除した場合、残りの1ファイルは削除しない

列挙した全ファイルに対して、質問→削除というのは簡単にいけそうな感じ。
自分の知識だけで無理と判断して投げるのはアレだと思ったんだけど、やっぱ難しいかなあ

703 名前:login:Penguin mailto:sage [2008/02/25(月) 18:09:02 ID:pu40lUxS]
#!/bin/bash
# askdelete.sh -- find . | finddup.sh | askdelete.sh
# よくテストされてませんので注意
TMPF=`mktemp /tmp/askdelete.XXXXXX`
trap 'rm $TMPF' 0
CURHASH=
COUNT=0
(cat; echo DUMMYHASH /dev/null) |
while read -r HASH FILENAME; do
    if [ "$CURHASH" ] && [ "$CURHASH" != "$HASH" ]; then
        echo "------------------------------"
        echo "$COUNT 件の一致ファイル:$CURHASH"
        tail -n $COUNT $TMPF | cut -b 33-
        echo "------------------------------"
        tail -n $COUNT $TMPF | while read -r HASH FILENAME; do
            [ $COUNT -eq 1 ] && break
            echo -n "$FILENAME を削除しますか? [yN] "
            while read ANSWER
            do
                case "$ANSWER" in
                [yY]) echo rm "$FILENAME"
                      COUNT=`expr $COUNT - 1` ;;
                esac
            done < <(head -1 /dev/tty)
        done
        COUNT=0
    fi
    echo $HASH $FILENAME >>$TMPF
    CURHASH=$HASH
    COUNT=`expr $COUNT + 1`
done

704 名前:login:Penguin mailto:sage [2008/02/25(月) 18:12:29 ID:pu40lUxS]
done < <(head -1 /dev/tty) とか、絶対おかしいよこれ。
違う言語で書き直したほうがいい。

705 名前:login:Penguin mailto:sage [2008/02/25(月) 18:17:46 ID:fTf5K0mT]
おおすげええΣ
ちょっとテストしてみます!

706 名前:login:Penguin mailto:sage [2008/02/25(月) 19:20:15 ID:pu40lUxS]
#!/bin/sh
# askdelete.sh -- find . | finddup.sh | askdelete.sh
TMPF=`mktemp /tmp/askdelete.XXXXXX`
trap 'rm -f $TMPF' 0 1 2 3 15
CURHASH=
COUNT=0
(cat; echo DUMMYHASH /dev/null) |
while read -r HASH FILENAME; do
    if [ "$CURHASH" ] && [ "$CURHASH" != "$HASH" ]; then
        echo "------------------------------"
        echo "$COUNT 件の一致ファイル:$CURHASH"
        tail -n $COUNT $TMPF
        echo "------------------------------"
        tail -n $COUNT $TMPF | while read -r FILENAME; do
            [ $COUNT -eq 1 ] && break
            echo -n "$FILENAME を削除しますか? [yN] "
            while read ANSWER; do
                case "$ANSWER" in
                [yY]) echo rm "$FILENAME"
                      COUNT=`expr $COUNT - 1` ;;
                esac
                break
            done < /dev/tty
        done
        COUNT=0
    fi
    echo $FILENAME >>$TMPF
    CURHASH=$HASH
    COUNT=`expr $COUNT + 1`
done
すこしよくなった
参考になる www.nurs.or.jp/~asada/FAQ/UNIX/section3.8.html

707 名前:login:Penguin mailto:sage [2008/02/25(月) 20:58:36 ID:NDOa2UbC]
理想的な流れだ。


708 名前:login:Penguin mailto:sage [2008/02/26(火) 01:26:57 ID:Knz7qJ2h]
>>706
サブシェルをわざわざ使う必要は無いのでは?

--- (cat; echo DUMMYHASH /dev/null) |
+++ { cat; echo DUMMYHASH /dev/null; } |

709 名前:login:Penguin mailto:sage [2008/02/26(火) 01:31:17 ID:V2S90oTo]
こんなのじゃ駄目?

find . -type f -print | xargs md5sum | sort | while read i
do
 set -- $i
 test -e .$1 && rm -i $2
 touch .$1
done

削除して残りが1つなら消さずに次、ということは最初の1つは
無条件で残して、2つ目以降についてのみ rm -i で削除確認すれば
いいんだよね?

記憶用に .<md5sum> なマーカ作ってるけど、ここは md5sum な
ダミー環境変数の方がいいかも。



710 名前:login:Penguin mailto:sage [2008/02/26(火) 08:30:35 ID:V4Ca66lJ]
>>709
全ファイルにmd5sumしたら遅くならない?

711 名前:login:Penguin mailto:sage [2008/02/26(火) 08:46:21 ID:M2OUW+0j]
>>708
パイプを使うと結局はサブシェルが起動されるんだから () のほうがわかりやすいと思うよ

712 名前:login:Penguin mailto:sage [2008/02/26(火) 09:53:07 ID:jk2VB7eG]
>>710
どうせシェルスクリプトなんて使い捨てなんだし
多少遅くてもいいんじゃない?
実行時間の長さより
思いついたことをちゃちゃっと実行できる手軽さが大事でしょ。

713 名前:login:Penguin mailto:sage [2008/02/26(火) 10:56:04 ID:V4Ca66lJ]
>>712
もっともな意見だと思うが、肝心なことを棚に上げてるな
シェルスクリプトの本質は処理を効率化するための機能なんだから、
手軽に加えて「より早くスマートに処理」できる方がいいだろうよ

どうせ使い捨てとか言い出したら、いつまで経っても遅くて低機能なスクリプトしか書けないぜ?
まあせっかくいい方向で流れてるから、俺も最適化してみるか。

714 名前:login:Penguin mailto:sage [2008/02/26(火) 15:09:02 ID:KrvpwwSS]
手作業で30分かかる作業を、わずかワンライン5秒で済ます。
どうよ、この快感、すごいよ、俺!!
ただしスクリブト書きに3時間かかるけどなっ!!、
みたいな・・・・


715 名前:login:Penguin mailto:sage [2008/02/26(火) 15:18:25 ID:jk2VB7eG]
5分で書いて実行時間3分にできればそれでおkだよな。
その作業を200回繰り返さなきゃいけないなら
3時間かけて書いて5秒に短縮してもいいけど、
そういうのはシェルじゃなくて別な言語を使った方がいいと思う。

716 名前:login:Penguin mailto:sage [2008/02/26(火) 16:04:42 ID:V4Ca66lJ]
>>714
良いスクリプトを早く書けるスキルを養うといった考えはないのかよw
まぁ価値観が違うなら仕方ないが

>>715
言いたいことは分かるし仕事では俺も同じスタンスだ。モトが取れない作業をするのはアホだと思う。
さらに>>1にあるようにPerlやPythonを使ってもいいと書いてあるように、別にシェルスクリプトに固執はしてないさ。
ただID:fTf5K0mTみたいに質問を丸投げせずに分かってないながらも自分で試してみている奴も居るんだから
「どうせ使い捨て」や「パンがなければケーキを」じゃなくて、しっかりした見本を見せてやろうぜw・・・と思ったんだ。

勝手に限界を作っちゃダメさ・・・!

717 名前:login:Penguin mailto:sage [2008/02/26(火) 17:08:11 ID:KrvpwwSS]
頑張るところが・・・まっいっか。人それぞれだな。

718 名前:login:Penguin mailto:sage [2008/02/26(火) 17:30:17 ID:DxWnmOPN]
>>717
茶化すだけならWindowsに切り替えてフリーソフトスレにでも行け。
同一ファイル発見ソフトなんていくつもあるから。
自分で作ろうと思わん奴はウザイだけだ。

719 名前:login:Penguin mailto:sage [2008/02/26(火) 22:37:31 ID:ecwr7n8r]
Windowsに切り替えて同一ファイル発見ソフトを探すってのもこれまた手間だよな



720 名前:login:Penguin mailto:sage [2008/02/27(水) 00:57:44 ID:k4ecn/gW]
ああそういう意味か。
Linuxならawkでもperlでもpythonでもgccでも大概入ってんだろうになんで
>Windowsに切り替えてフリーソフトスレにでも行け
なのかマジで理解できなかった。
なるほどな、そういう考え方もあるか。これは考えが及ばなかったな。
まぁうちext3だしなぁ。

721 名前:login:Penguin mailto:sage [2008/02/27(水) 02:09:44 ID:5Pe1iZtE]
>>711
サブシェル一個より分かりやすさを重視、ってのも分かるが
プロセスを fork するコストはバカにできないぞ。
たった 10 回でもこれだけ差が出る。

$ time for i in 0 1 2 3 4 5 6 7 8 9 ; do { :; } ; done
real 0m0.001s
user 0m0.010s
sys 0m0.000s

$ time for i in 0 1 2 3 4 5 6 7 8 9 ; do ( :; ) ; done
real 0m0.221s
user 0m0.140s
sys 0m0.140s

今回のはともかく、ループの中で無駄なサブシェル起こすと
かなり処理速度に効いてくるから、「より早くスマートに処理」を
目指すなら気にした方がいいと思うよ。

722 名前:login:Penguin mailto:sage [2008/02/27(水) 12:04:07 ID:5xPFitgJ]
>>721
そうじゃなくて、パイプではサブシェルが起動されるでしょう?
$ { FOO=foo; echo $FOO; } | cat
foo
$ echo $FOO
$

723 名前:login:Penguin mailto:sage [2008/02/27(水) 23:04:12 ID:6K2aGQ5h]
>>722
popenってfork & execvじゃなかったっけ?

724 名前:login:Penguin [2008/02/28(木) 01:04:44 ID:2c894vLr]
$cat a001
abc

$cat a002
def

$cat a003
ghi

という内容の連番ファイルがあるときに、
a001,a002,a003ファイルそれぞれの先頭に
自身のファイル名を追記していくにはどのようにすればいいでしょうか?

$cat a001
a001
abc

$cat a002
a002
def

$cat a003
a003
ghi

725 名前:login:Penguin mailto:sage [2008/02/28(木) 01:27:48 ID:k7I0oIXn]
for a in *; do
echo $a > temp
cat $a >> temp
mv temp $a
done

726 名前:login:Penguin mailto:sage [2008/02/28(木) 01:53:39 ID:2c894vLr]
>>725
できましたありがとうございます!!

727 名前:login:Penguin mailto:sage [2008/02/28(木) 11:40:05 ID:xnWdeCI1]
csvの編集をしているのですがカンマを含むデータがある場合に特定の列を削除するいい方法はないでしょうか?

例:
編集前) aaa,bbb,"ccc,ddd","eee",ff

編集後) aaa,"ccc,ddd",ff

カンマを含むデータは必ずダブルクォーテーションで囲まれているのですが
どの列にカンマを含むデータが存在するかは不明です。
192の方法だと特定の列は出せるのですが、複数列を表示することができないので。。。

728 名前:login:Penguin mailto:sage [2008/02/28(木) 11:45:53 ID:sfXUxgeO]
>>727
シェルスクリプトでがんばるより↓あたり使ったら?
blog.livedoor.jp/dankogai/archives/50765677.html

729 名前:login:Penguin mailto:sage [2008/02/28(木) 12:17:28 ID:DWKM9TyE]
>>727
無駄にがんばってみた。PerlとかSQLiteとか使った方が絶対いい。
#!/usr/bin/awk -f
BEGIN {OFS=",";}
function csplit(s,a,c,f,i,j,k){delete a;for(i=j=1;;i++){
c=substr(s,i,1);if(c==""){a[k++]=substr(s,j,i-j);break;}
else if(c=="\""){if(f>0){if("\""==substr(s,i+1,1))i++;
else f=0;}else f=1;}else if(c==","&&f==0){a[k++]=substr(s,
j,i-j);j=i+1;}}return k;}
{n=csplit($0,array);print array[0],array[2],array[4];}



730 名前:login:Penguin mailto:sage [2008/02/28(木) 20:37:03 ID:VzdvBwjj]
吐きそうだ。
字下げを知らないやつがまだこの世にいたのか。

731 名前:login:Penguin mailto:sage [2008/02/28(木) 20:53:53 ID:k7I0oIXn]
>>730
じゃあお手本をちょっと見せてくれ

732 名前:login:Penguin mailto:sage [2008/02/28(木) 22:39:21 ID:VzdvBwjj]
死ぬまで>>729記法で頑張りゃいいんじゃね?
それも個性だ。

733 名前:login:Penguin mailto:sage [2008/02/28(木) 22:40:23 ID:gxJgMbC8]
敗北宣言はええ

734 名前:login:Penguin mailto:sage [2008/02/29(金) 00:47:32 ID:1XKkNNaQ]
2ch に貼る時気をつけないと空白スペース詰められちゃうよね

735 名前:login:Penguin mailto:sage [2008/02/29(金) 01:30:01 ID:Pgw8LnNi]
そこで&nbsp;

736 名前:login:Penguin mailto:sage [2008/02/29(金) 01:41:57 ID:bnE90VmD]
行末にタブがある行を検索しようと
egrep '\t$'
としてもマッチしません。awkだと
awk '/\t$/'
でマッチするのですが、grepだとどう書けばいいのでしょうか?

737 名前:login:Penguin mailto:sage [2008/02/29(金) 01:59:08 ID:Pf9U77bc]
元々、\tなどのメタキャラクタはgrepにもawkにもなかった。
GNU awkがPerlの影響を受けて拡張しただけ。

738 名前:login:Penguin mailto:sage [2008/02/29(金) 02:10:07 ID:bnE90VmD]
そうなのかー・・・ちょっとしょぼーん。拡張されてもいい感じなんだけどね。
grep sed awk ぐらい正規表現は統一して欲しかったorz

739 名前:login:Penguin mailto:sage [2008/02/29(金) 08:36:03 ID:qSBWA6nK]
タブを¥tと書きたかった理由が
シェルからコマンドラインにタブを打とうとして補完機能に取られるから、
であれば、Ctrl-V TAB でたぶんOK。





740 名前:login:Penguin mailto:sage [2008/02/29(金) 09:40:38 ID:HrPH8ECW]
くだ質からこちらに誘導されたので、こちらで質問させて下さい。

ド素人質問で悪いのですが

$ cat text1.txt
1
2
3

$ cat text2.txt
3
4
5

という二つのファイルがあるとして、それを1行ずつ割り算したいのです。
結果としてこういう形になれば満足です。

$ cat result.txt
0.33
0.50
0.60

どのように記述すれば良いのでしょうか、シェルは普段bashを使っていますが、
もちろんshでも構いません。宜しくお願いします。

741 名前:login:Penguin mailto:sage [2008/02/29(金) 09:42:18 ID:/PNY/URb]
>>740
ぱっと思いついたもの。

( echo 'scale=2' ; paste -d/ text1.txt text2.txt ) | bc






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<275KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef