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

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

■ このスレッドは過去ログ倉庫に格納されています
0001ミスターシェル2006/09/07(木) 13:00:11
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
0724名無しさん@お腹いっぱい。2007/01/13(土) 01:27:34
>>719
(...)じゃなくて{...;}じゃダメ?
0725名無しさん@お腹いっぱい。2007/01/13(土) 02:33:57
>>724
自分でまずやってみろよ
0726名無しさん@お腹いっぱい。2007/01/14(日) 01:54:35
最近のシェルは`test`や`[`が組み込みコマンドになってるとのことで
確かにpowerpc-apple-darwin8.0のbash 2.05b.0(1)-releaseでは`builtin`で呼び出せることも確認しました
一方で/bin/[や/bin/testも存在し、当然実行可能でした
また、若干の差異はありますが、複合コマンド(compound command)の`[[ expression ]]`もほぼ同じ用途に利用できます

そこで質問なんですが、少し上で話されていたような処理の重さ(無駄なプロセスの生成等)を考えた場合、
どれを使うのがベストなんでしょう?
0727名無しさん@お腹いっぱい。2007/01/14(日) 02:03:12
当然内部コマンドでしょう。
つーか、パフォーマンス重視な場合は
シェルスクリプトなんか使うな。
0728名無しさん@お腹いっぱい。2007/01/15(月) 02:32:27
cat access.log | grep $URL | wc -l >> $FILE

という感じで、アクセスログから、特定のURLを探して数を数えて、その数をファイルに書き込んでいるのですが、これを毎日やると、
10
20
10
15
といった感じで、改行されてしまいます。
これを
10,20,10,15
という風に、,区切りにするにはどうすればよいでしょうか?
0729名無しさん@お腹いっぱい。2007/01/15(月) 03:50:32
>>728
tr -d '\n' < filea | sed -e 's/[ ]\{1,\}/,/g'
的な
0730名無しさん@お腹いっぱい。2007/01/15(月) 03:56:11
tr '¥n' ','
0731名無しさん@お腹いっぱい。2007/01/15(月) 03:56:54
おや、こんな時間にかぶるとは。
0732名無しさん@お腹いっぱい。2007/01/15(月) 06:03:29
sedについて質問です。
hoge.datというファイルがあるとして、
その中身が以下のようであったとします。
aaa
これを、
aaa
bbb
ccc
のように変更したいのです。
で、sedでこれを実現しようとする場合、
#!/bin/sh
sed 's/aaa/aaa \
bbb \
ccc/' hoge.dat
exit 0
こんな感じになると思います。
シングルコーテーションのとこがダブルコーテーションの場合は、
#!/bin/sh
sed "s/aaa/aaa \\
bbb \\
ccc/2 hoge.dat
exit 0
のように、\マークがふたつになると思います。
どうして、シングルコーテーションの場合は、\マークがひとつで、
ダブルコーテーションの場合は、\マークがふたついるのでしょうか?
よろしく呉教授お願いします。
0733名無しさん@お腹いっぱい。2007/01/15(月) 06:36:10
呉教授はいいねえ
呉智英?なんてね
0734sage2007/01/15(月) 09:21:26
>>733
リアルで引いた。
0735名無しさん@お腹いっぱい。2007/01/16(火) 23:37:40
ダブルクオートの場合は、一つめの\がシェルに持ってかれてる。
シングルクオートの場合はシェルに持ってかれないので\一つでOK。

こんな感じでシェルを介さなければ\一つでいける。
> cat replace.sed
s/aaa/aaa \
bbb \
ccc/
> sed -f replace.sed hoge.dat
aaa
bbb
ccc
>

SH(1)
> Double Quotes
> Enclosing characters within double quotes preserves the literal
> meaning of all characters except dollarsign (`$'), backquote
> (``'), and backslash (`\'). The backslash inside double quotes
> is historically weird. It remains literal unless it precedes the
> following characters, which it serves to quote:
> $ ` " \ \n
0736>>7322007/01/17(水) 05:11:59
>>735
ありがとうございますー
0737名無しさん@お腹いっぱい。2007/01/18(木) 05:23:42
質問させてください。

以下のHTMLファイルがあるとします。
------------------------
<html>
<body>
<!--
memo
-->
hoge
</body>
<html>
------------------------
これを、以下のように<!--から-->の部分を削除したいのです。
------------------------
<html>
<body>
hoge
</body>
<html>
------------------------

このようなことをしたい場合、シェルスクリプトではどのようにすればよいでしょうか?

ちなみに、うちの会社の吉田さん曰く「そんなのawk使えば一発だよ!」といってました。。
0738名無しさん@お腹いっぱい。2007/01/18(木) 07:34:59
吉田、センスねーな。
awkでもできるがsedを使うのが普通の感覚じゃね?
もちろん、後出しで仕様が複雑にならなければの話だけどな。

ちなみにsed的には/^<--/,/^-->/dとかだけど。
0739名無しさん@お腹いっぱい。2007/01/18(木) 07:59:25
>>738
違うよ。
0740名無しさん@お腹いっぱい。2007/01/18(木) 09:02:41
>>738
仕様はHTMLの文法通りと考えるべきだろ。後出しでも何でもない。
よって >>738 はその意味でも間違い。
0741名無しさん@お腹いっぱい。2007/01/18(木) 09:15:58
HTML の文法にしたがうとしたら
シェルスクリプトでやろうというのが間違いだな。
0742名無しさん@お腹いっぱい。2007/01/18(木) 10:12:38
>>738
つ「最長一致」

0743名無しさん@お腹いっぱい。2007/01/18(木) 10:39:36
HTMLなりSGMLをパースできる言語を使えよ
0744名無しさん@お腹いっぱい。2007/01/18(木) 17:58:56
>>737
bashでやってみました

#!/bin/bash

OLDHTML=$1
NEWHTML=$2
COMMENT=0

while read LINE
do
while echo $LINE | grep -q '<!--.*-->'
do
PARTLINE=${LINE%%<!--*}
LINE=$PARTLINE${LINE#*-->}
[ ! $LINE ] && continue 2
COMMENT=0
done

if echo $LINE | grep -q '<!--'; then
LINE=${LINE%<!--*}
[ $LINE ] && echo $LINE >> $NEWHTML
COMMENT=1
elif echo $LINE | grep -q '¥-->'; then
LINE=${LINE#*-->}
[ $LINE ] && echo $LINE >> $NEWHTML
COMMENT=0
elif [ $COMMENT -eq 0 ]; then
echo $LINE >> $NEWHTML
fi
done < $OLDHTML
0745名無しさん@お腹いっぱい。2007/01/18(木) 18:18:42
愚直な実装では、CDATAの中のコメントも取り除かれてしまうだろう。
真面目にやるなら、htmlパーサ使っとけってこった。
0746名無しさん@お腹いっぱい。2007/01/18(木) 18:27:23
>>741,743,745 は >>738
0747名無しさん@お腹いっぱい。2007/01/18(木) 19:02:08
sedよりawk向きではある。
0748名無しさん@お腹いっぱい。2007/01/18(木) 19:07:10
俺は743だが
たぶんみんな別人だと思うぞ
0749名無しさん@お腹いっぱい。2007/01/18(木) 21:30:05
俺は>>745だが、この件に関しては>>745しか書いてないぞ。
0750吉田2007/01/18(木) 23:57:28
おまえら、レベルひくいなーw
とくに>>744は茶ふいたわ。

>>737のいっているHTMLファイルを仮に、index.htmlというファイルとすると、

cat index.html | awk '/^<!--/,/^-->/ {next} {print}'

こうやればOK。

ばーか!
0751名無しさん@お腹いっぱい。2007/01/19(金) 00:04:34
なんでわざわざcatすんだw
0752名無しさん@お腹いっぱい。2007/01/19(金) 00:06:25
「cat不要」はこのスレの基本だからな。
0753吉田様2007/01/19(金) 00:06:30
>>751
ばかだなー
このほうが見やすいだろ?

0754吉宗2007/01/19(金) 00:09:27
738 グダグダだな
07557382007/01/19(金) 00:12:12
俺は>>738以降は知らんぞ。正直筆が滑ったと反省して静かにしてたがな。
0756徳田2007/01/19(金) 00:14:20
すまない。754は見なかったことにしてくれ。
0757名無しさん@お腹いっぱい。2007/01/19(金) 00:15:09
HTMLのコメント処理が簡単と言ってる(思ってる)ヤツは
とりあえずばけらさんとこでも読んどけ

>>737は本気で回答がほしければ
全ての形式のHTMLコメントを除去したいのか
>>737の形式のコメントを除去したいのか補足しろ

ってことでしょ
前者ならシェルスクリプト向きじゃないけど
0758>>7372007/01/19(金) 00:18:01
>>750
偽物の吉田さん、本当にありがとうございますw

>>744さんも勉強になりました。ありがとうございます。
0759吉田様2007/01/19(金) 00:24:15
>>757
茶ふいたわww

前者だろうが、後者だろうがawkでやるのが一番だろが。

ばーか、ばーかー
0760名無しさん@お腹いっぱい。2007/01/19(金) 00:27:54
>>758
で、>>757はどっちなんだ?
0761名無しさん@お腹いっぱい。2007/01/19(金) 17:31:08
xmlawk
0762名無しさん@お腹いっぱい。2007/01/19(金) 19:32:18
xmltwig.comが見えないのだけど
0763名無しさん@お腹いっぱい。2007/01/25(木) 13:51:51
デスクトップ環境を起動するときに、/usr/X11R6/bin/startxか.xinitrcあたりに
起動する前に好きなウィンドウマネージャを選べるようにコードを追加したいのですが、
どのようにすればいいのでしょうか?
0764名無しさん@お腹いっぱい。2007/01/25(木) 13:56:32
>>763
gdm でも使ったら?
0765名無しさん@お腹いっぱい。2007/01/25(木) 14:01:49
gdmはやめとけ
0766名無しさん@お腹いっぱい。2007/01/25(木) 14:05:12
>>765
何がおすすめ?
0767名無しさん@お腹いっぱい。2007/01/25(木) 14:07:20
kdm
0768名無しさん@お腹いっぱい。2007/01/25(木) 14:12:47
>>767
その理由は?
0769名無しさん@お腹いっぱい。2007/01/25(木) 14:14:24
xdm
0770名無しさん@お腹いっぱい。2007/01/25(木) 14:15:47
>>769
wm 選べたっけ。
0771名無しさん@お腹いっぱい。2007/01/25(木) 14:22:09
>>763
xmessage のような物でも使って問い合わせるとかかな
0772名無しさん@お腹いっぱい。2007/01/25(木) 14:26:51
>>763
xdialog
0773名無しさん@お腹いっぱい。2007/01/26(金) 01:27:22
>>763
俺は$WMで分岐してる

case ${WM:-wmaker} in
wmaker) ... ;;
gnome) ... ;;
kde) ... ;;
*) ... ;;
esac
0774名無しさん@お腹いっぱい。2007/01/26(金) 09:03:20
それがどうした
0775名無しさん@お腹いっぱい。2007/01/26(金) 13:49:37
やはりstartxのスクリプトに追加した方がいいんですかね・・・
0776名無しさん@お腹いっぱい。2007/01/26(金) 13:59:34
gdm でいいじゃん。
0777名無しさん@お腹いっぱい。2007/01/26(金) 14:00:16
gdm は死んでもやめとけ
0778名無しさん@お腹いっぱい。2007/01/26(金) 14:06:56
>>777
その理由は?
0779名無しさん@お腹いっぱい。2007/01/26(金) 14:11:34
毎日同じ時間に何やってんだ。宣伝か?
0780名無しさん@お腹いっぱい。2007/01/26(金) 17:33:13
漢ならtwm一本で行けよ!fvwm2でもいいけどw
0781名無しさん@お腹いっぱい。2007/01/26(金) 17:38:48
つuwm
0782名無しさん@お腹いっぱい。2007/01/28(日) 05:14:10
「変数$listに格納された5個の小数点のついた数字」
の中で、「20以上である」という条件を満たしたものが
いくつあるのかを数えたいです。
例えば、変数$listの中身が
10.4
30.2
15.4
5.2
20.2
だった場合には、答えは2と出るようにしたいのです。

n=1
sum=0

while [ $n -le 5 ]
do
s=`echo "$list" | sed -n "$n p"`
y=`trunc("$s")`
if test "$y" -ge 20
then sum=`echo "scale=0; $sum + 1" | bc`
else
exit 1
fi
n=`expr $n + 1`
done

echo $sum
07837822007/01/28(日) 05:15:34
上記のbash scriptでいいのかな、と思ったのですが、
エラーになります。
変数$sに数値がひとつひとつ代入されて行くのは確認できたのですが、
小数点を切り捨てるためのtruncコマンドのところでエラーになります。
command substitution: line 1: syntax error near unexpected token `"$s"'
command substitution: line 1: `trunc("$s")'

どこがおかしいのか教えていただけませんか?
0784名無しさん@お腹いっぱい。2007/01/28(日) 06:18:11
最近のbashはtruncなんてあるのか。
0785名無しさん@お腹いっぱい。2007/01/28(日) 06:47:50
関数にしろコマンドにしろ、呼び出しは trunc "$s" の形になるはずだろ。
というか、小数扱うなら awk 使っとけ
0786名無しさん@お腹いっぱい。2007/01/28(日) 09:00:04
>>782
nn=0; for aa in $list; do if [ ${aa%.*} -ge 20 ]; then nn=$((nn + 1)); fi; done; echo $nn;
0787名無しさん@お腹いっぱい。2007/01/28(日) 09:14:30
bash依存しまくりスクリプトは犬板逝け
07887822007/01/28(日) 09:15:01
>>784
>>785
man truncしたらこんなのが出てきましたが。
つまり、truncはたぶんtrunc(数字)とかいう形で使うのかな、
と思ったのです。実際trunc "数字"ではうまくいきませんでした。
しかし、trunc()の形にしたところで
$ trunc(23.4)
-bash: syntax error near unexpected token `23.4'
こんな感じでエラーになり、たぶん正しい文法になっていないのが
ネックになっているような雰囲気です。

NAME
trunc -- truncate to integer value
SYNOPSIS
#include <math.h>
double
trunc(double x);
long double
truncl(long double x);
float
truncf(float x);
DESCRIPTION
The trunc() functions return the integral value nearest to but no larger
in magnitude than x.
SPECIAL VALUES
trunc(+-0) returns +-0.
trunc(+-infinity) returns +-infinity.
SEE ALSO
ceil(3), rint(3), math(3)
STANDARDS
The trunc() functions conform to ISO/IEC 9899:1999(E).
BSD January 29, 2003 BSD
07897822007/01/28(日) 09:19:35
>>786
ありがとうございます。
これはなんの言語でしょうか。これがawk?
実際にこれでやってみましたがうまくいきません。
そもそも
${aa%.*}
この意味がわかりません。
けど、これを使うとtruncを使わずに済むので
便利そうですね。
いろいろと勉強してみます。

>>787
今はたまたまbashの勉強をしているので、
別にbashに依存しているわけではありません。
excelとか使った方が速いのはわかってますが、
無理やりbashでやろうとすることで
「 ( ・∀・)つ〃∩ ヘェーヘェーヘェー truncなんて関数があるんだ!」
という発見があるので、おもしろいのですよw
0790名無しさん@お腹いっぱい。2007/01/28(日) 09:30:33
man bashを一通り読めと。
0791名無しさん@お腹いっぱい。2007/01/28(日) 10:23:58
>>788
それ、マニュアルページの一番上に trunc(3) て書いてるんじゃない?

マニュアルのセクション3は、Cのライブラリ関数。
07927822007/01/28(日) 17:54:08
>>791
!!!!
全くその通りです!
bashでは使えないのですね・・・orz
bashの中でCのライブラリ関数を使う方法か、
他に小数点切り捨てによい方法はありませんか?
0793名無しさん@お腹いっぱい。2007/01/28(日) 22:07:05
切り捨てる必要があるのかと
0794名無しさん@お腹いっぱい。2007/01/28(日) 22:17:42
>>793

[ は切り捨てないと使えないyo
0795名無しさん@お腹いっぱい。2007/01/28(日) 22:32:23
>>789
本当にbash使ってるなら、>>786 で合ってるよ。awkは関係ない。
これ自体がbashのスクリプト。

bashじゃない普通の shでも動くように >>786 を書き直してみた。
↓ (ちなみに俺は >>786 とは別人)

nn=0
for aa in $list
do
if [ `expr $aa : '\(.*\)\..*'` -ge 20 ]; then
nn=`expr $nn + 1`
fi
done
echo $nn
0796名無しさん@お腹いっぱい。2007/01/28(日) 22:34:34
単なるshで書ける奴って強いよな。
0797名無しさん@お腹いっぱい。2007/01/29(月) 14:38:20
若干スレ違い気味な気もしますが

ttp://x68000.q-e-d.net/~68user/unix/pickup?iconv

> 入力ファイルに無効な文字 (-f で指定した文字コードと矛盾するようなデータ) が
> 含まれていた場合、iconv はエラーとして終了する。FreeBSD の iconv では
> -c オプションを指定することで、無効な文字を無視して無視して続行することができる。
> 他の iconv では必ずエラーで終了してしまうようだ。

Linux で、変な文字を無視しつつ文字コードの変換をしたいときにはどうするのがベストでしょうか。
(個人的に馴染のある言語の) php で iconv//IGNORE をする、という手は思いついたのですが。
0798名無しさん@お腹いっぱい。2007/01/29(月) 14:50:35
スレ違いじゃなく板違い
Linuxでどうするのかを聞くなら
Linux板がいいでしょう。
07997822007/01/29(月) 21:06:29
>>795
か、神!!!!
おかげさまでついにできました!
実はやりたかったことは、
「猛暑日(最高気温が35度以上の日)が2006年8月に何日あったか」
を各都市ごとに数えてみたかったのです。
そうすれば、熊本、佐賀、京都がいかに暑いところか
理解してもらえるかなと思って。

こんな感じでできました!!
ttp://sheel.mydns.jp/~sheel/moushobilastaugust.shtml
bashスクリプトファイルはここに置いておきますのね。
ttp://sheel.mydns.jp/~sheel/moushobilastaugust.sh

またいろいろと教えてください。by 皮先くん
08007822007/01/29(月) 21:09:19
>>799
ちなみにshtmlの方は、12個の都市について
その場で気象庁からデータをとりにいって解析するので
クリックしてから表示されるまで1分弱ほど時間がかかりますので
辛抱強くお待ちくださいね。
0801名無しさん@お腹いっぱい。2007/01/30(火) 09:09:26
>>800
なかなかおもしろいね。
色々応用が利きそう。
0802名無しさん@お腹いっぱい。2007/01/31(水) 09:39:22
>>782
まだやってたんだね。
Mac板でのやりとりがなつかしいぜ…
08037822007/01/31(水) 16:57:24
冬日(=最低気温が0度を下回った日)が2007年1月に何日あったかを
13の都市について気象庁から一気にデータを取得して
自動計算するシェルスクリプトもつくってみました。
<13の都市とは>
東京、大阪、京都、静岡、浜松、
熊本、鹿児島、枕崎、福岡、佐賀、大分、宮崎、長崎

「冬日が何日あったかを計算して表示する」
(13の都市のデータを取得するため1分弱ほど時間がかかります)
ttp://sheel.mydns.jp/~sheel/fuyubi200701.shtml
ソースはこちらです。
ttp://sheel.mydns.jp/~sheel/fuyubi200701.sh
0804名無しさん@お腹いっぱい。2007/02/01(木) 12:23:44
>>802
オレも気付いた
のでスルーしといた
0805名無しさん@お腹いっぱい。2007/02/01(木) 14:41:45
そのリンクを踏んだら気象庁にと〜つげきよ〜
0806名無しさん@お腹いっぱい。2007/02/01(木) 21:39:01
>>802
俺も気がついた
ので教えてやった。
皮先のスクリプトはよく利用させてもらってて重宝してるし。
0807名無しさん@お腹いっぱい。2007/02/02(金) 20:25:38
リモートホスト上の任意のディレクトリが存在するかチェックしたいのですが

remsh $リモホ名 -n "find $ディレクトリ名 -type d -name $ディレクトリ名 -print"
で値が取得できるかどうかでディレクトリがあるかチェックしようと思っているのですが
もうちょっとスマートなやりかたがありますでしょうか?・・
0808名無しさん@お腹いっぱい。2007/02/02(金) 20:30:16
findじゃなくtest -d $directoryでいいんじゃない?
0809名無しさん@お腹いっぱい。2007/02/03(土) 16:34:40
太郎 84
花子 83
裕子 98
尚美 91

という生徒のテストの点数を記載したデータがあったとき、
これを点数の高い順番でソートしたいのですが、
いろいろ調べるとawkがこういうのを得意にしているような気がしました。
この処理を簡単に行うにはawkが最も適していますか?
他に適している言語はありますか?

といいますのも、awkについて調べてみたのですが、
点数を加算する、とかはわかったのですが
点数の高い順番でソート、は無理なような気がしましたので・・・。

awkが最も適している、ということであればもうちょっとがんばってみたいと思いますが。
0810名無しさん@お腹いっぱい。2007/02/03(土) 16:53:29
>>809
ソートはsortでいいじゃん。

キーとするフィールド位置の指定だとか、アルファベット順じゃなく数の大小でのソートだとか、
そういうオプションもあるので、後はsortのmanみてみるとよいです。
0811名無しさん@お腹いっぱい。2007/02/03(土) 16:54:59
区切りが809の通りならsort +1 -nr でいいんじゃないかな。
08128092007/02/03(土) 18:17:50
>>810
>>811
sort!!!!!
そ、そんな普段から自分でもよく使ってるやつで可能だったんですね!
さっそく>>811さんのようにやってみたらうまくいきました!

ありがとうございました。
0813名無しさん@お腹いっぱい。2007/02/03(土) 18:31:44
whileやfor構文で繰り返されて出力される結果を
>>out.txt
を使ってどんどんファイルに書き加えていくのはわかりました。
では、ファイルに出力するのではなく、
(変数として?)メモリ上に出力していく方法はありますか?
例えば、

1回目の繰り返し文によって、変数$ssの値が5になりました。
変数$yyの中身は
5
となりました。

2回目の繰り返し文によって、変数$ssの値が2になったので、
変数$yyの中身は
5
2
となりました。

3回目の繰り返し文によって、変数$ssの値が7になったので
変数$yyの中身は
5
2
7
となりました。

こんな$ssに対して$yyのように出力が可能な方法はありますか?
0814名無しさん@お腹いっぱい。2007/02/03(土) 18:39:33
while ...; do
 # ...
 yy="$yy
$sss"
 # ...
done

echo "$yy"


単純にこうやるとyyの中身の1行目に空の行が出来ちゃうから、
yyが空かどうかチェックしたほうがいいか。
0815名無しさん@お腹いっぱい。2007/02/03(土) 18:48:28
set -
while ...; do
set "$@" "$yy"
done

for a in "$@";do
echo "$a"
done
0816しまった2007/02/03(土) 18:50:23
set --
while ...; do
set "$@" "$yy"
done

for a in "$@";do
echo "$a"
done
0817名無しさん@お腹いっぱい。2007/02/03(土) 19:04:22
>>814
なるほど。言われてみると簡単ですね・・・。
実際に自分でやってみたら、確かにできました。
最初の空白行は
yyが殻かどうかチェックするより
最後にsedとかで削除した方が簡単なのでそうしようと思います。
sed '/^$/d'
これをパイプしようと思います。
ありがとうございました。

>>815
よく意味がわからないのですが、
とりあえず814さんの方法でできましたので
お気持ちだけいただいておきます。
ありがとうございました。
0818名無しさん@お腹いっぱい。2007/02/03(土) 19:21:52
815の方法は、setで $1, $2, ... に追加していって最後に
それら全体である$@をループで回すことで取り出してる。
0819名無しさん@お腹いっぱい。2007/02/03(土) 19:35:54
>>818
なるほど、意味がわかりました!
ありがとうございます。
0820名無しさん@お腹いっぱい。2007/02/03(土) 19:49:44
$echo test.txt
太郎 84 25
花子 83 21
裕子 98 24
尚美 91 23
冬美 84 21

このように名前 点数 出席日数があったとき、
第一ソートは点数で、第二ソートは出席日数でソートし、
裕子 98 24
尚美 91 23
太郎 84 25
冬美 84 21
花子 83 21
こういうふうに出力したいのですが、
$echo test.txt | sort +2 -nr | sort +1 -nr
こうして二段階のsortでいいのかな?と思ったけど、
むしろ必ず
冬美 84 21
太郎 84 25
と、逆になってしまいます。そこで、
$echo test.txt | sort +2 -n | sort +1 -nr
-rオプションを外してやってみても同じ結果でした・・・orz

なにか別のコツなどがあるのでしょうか?
0821名無しさん@お腹いっぱい。2007/02/03(土) 19:51:09
終了
08228202007/02/03(土) 20:08:12
自己解決しましたが、回答を書いておきます。
sortは一度に複数のオプションを指定可能なので
第1フィールドを昇順でソートし、
第2フィールドは降順でソート、
ということが可能のようです。
この場合、具体的には以下のようにします。

$echo "text.txt" | sort +1nr +2n

ちなみに>>819のようなことがやりたい場合は

$echo "text.txt" | sort +1nr +2nr
ですね。

参考
ttp://biking.taiiku.tsukuba.ac.jp/~takai/Unix/Unix-text.html
0823名無しさん@お腹いっぱい。2007/02/03(土) 20:12:13
echoじゃなくcatじゃないの?
というか、cat使うと「catイラナイ」と言われるけどさ。
■ このスレッドは過去ログ倉庫に格納されています