• ベストアンサー

月名でソートを行いたいのですが・・・

Solaris8上で、ソートコマンド『sort -M 入力ファイル名』をやったのですが、上手く月名でソートを行ってくれません。入力ファイルは、月名のみのレコードが書かれたテキストファイルです。以下に、私が入力した月名を示します。 JAN、FEB、MAR、APR、MAY、JUN、 JUL、AUG、SEP、OCT、NOV、DEC もう一点、同一レコードを削除する『-u』オプションも上手く動きません。 どなたかご存知でしたら教えて頂けませんか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> 『-u』については > 開始フィールド(+No)の値が重複すると削除されてしまうのですね。 > レコード全て同一でないと削除しないと思っていました。 man sort の -u のところを見れば書いてありますが、ソートキーが同一の行を削除します。 +pos1 や -k によるソートキーの指定をしなければ、行全体がソートキーになります。 なので、sort を二回組み合わせれば、同一行を削除し、かつ、一部のフィールドだけを キーにして並べ替えできます。例えば、 % sort -u 入力ファイル | sort -k 2,2 -M とか。

super-saiyajin
質問者

お礼

a-kuma様 すみません。私の調査不足でした。 パイプを使うと上手くいくんですね。 たびたびありがとうございました。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

No.1 の回答にあるように locale の問題でしょう。月名を英語で書くならば、一時的に LANG を変えるのが良いですね。 % env LANG=C sort -M 入力ファイル -u についても、-M とあわせて使っており、それでうまく動かない、ということであれば、 問題の根は一緒です。

super-saiyajin
質問者

お礼

a-kuma様 一時的にLANGを変更するやり方、とても参考になりました。 月名での並べ替えは成功しましたが、『-u』については 開始フィールド(+No)の値が重複すると削除されてしまうのですね。 レコード全て同一でないと削除しないと思っていました。 ご回答ありがとうございました。

  • 3rd
  • ベストアンサー率30% (7/23)
回答No.1

Solaris の sort コマンドの並べ替えオプションは、 -M に限らず LC_COLLATE の値に依存します。 よって、JAN 等の文字列を正しく月の名前としてソートさせるには、 環境変数 LANG を C にするのが一番手っ取りばやいでしょう。 LANG の値が、Japanese 等の場合は、思ったように ソートされないことになります。 -u オプションについては、動作しない理由について 見当がつきません。

super-saiyajin
質問者

お礼

3rd様 LANGをCに設定し、再度試してみたところ、無事に並べ替えが成功しました。 ありがとうございました。

関連するQ&A

  • エクセルについて

    エクセルについて 会社のエクセルで、例えば、34-07と入力すると、Jul-34と変換されます。 でも、56-78と入力するとなにもなりません。 どうやら、01,02,03,04…11,12だと、それぞれ、Jan,Feb,Mar,Apr…Nov,Decと英語での月の名前に変換されてしまいます。 セルの書式設定で直しても、直りませんでした。なぜか、ユーザー定義という設定になってしまいます。 どうしたら、56-04と入力しても、Apr-56という風にならず、56-04と入力できるようになりますか?

  • 一月前の日付を求めるプログラム(pascal)

    大学の課題で「一月前の日付を求めるプログラムを作れ。その日が無ければその月の最後の日を示す。」というのが出題されました。12月18日(火)と入力すると11月18日(日)、12月31日(月)なら11月30日(金)となる具合です。 列挙型を用い書いてみたのですが、コンパイルしたら「Type-clash」と出てコンパイルできませんでした。どう改善すべきかアドバイスお願いします。 program calender(input,output); type months=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Nov,Oct,Dec); weeks=(Mon,Tue,Wed,Thu,Fri,Sat,Sun); var x,x1,z,z1:char; y,y1,p1,p2,i,r:integer; begin writeln('月:'); readln(x); writeln('日:'); readln(y); writeln('曜日:'); readln(z); if x=Jan then begin x1:=Dec end else begin x1:=pred(x)            {x1=表示する月} end; if y>=29 then if x=Mar then begin y1:=28 end else begin y1:=y             {y1=表示する日} end; case x of May,Jul,Aug,Nov,Dec : p1:=30; Jan,Feb,Apr,Jun,Sep,Oct : p1:=31; Mar : p1:=28 {月の違いによる日数の違い} end; p2:=y-y1;     {日にちの違い} r:=(p1+p2)-trunc((p1+p2)/7)*7; {7で割った余り} for i := 1 to r do z1:=pred(z);          {z1=表示する曜日} writeln(x1,'月',y1,'日',z1,'曜日') end.

  • ポインタの基本的な問題

    ポインタの勉強をしています。変数にポインタが付いている場合の動作は大体理解したつもりですが以下のように関数にポインタが付いているとどう扱えばいいのかわかりません。とりあえず、まずはtsukinonamae関数にinteger 1を渡して「1月」と表示させることから始めようとしていますが、それすらコンパイルエラーになります。引数nに1を渡すところはいいですよね?その後、nam[1]に入っているjanという文字列をchar型で返す?と思うのでメイン部で宣言したcharに渡そうとしているのですが。。 何が問題なのでしょうか。 char *tsukinonamae(int n); int main(){ int n = 1; char s[30]; s = tsukinonamae(n); printf("%s\n", s); } char *tsukinonamae(int n){ static char *nam[] = { "none", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; return (n<1 || n>12) ? nam[0] : nam[n]; }

  • 掲示板のcookieが消える?

    自分のサイトに設置してあるBBSなんですが、cookieで名前やメアドを記憶しているはずが、ある日を境に出なくなったんです。 cookieは60日間有効にするために、以下のように書いています。 local($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+60*24*60*60); @month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec); $cook="name<>$in{'name'}\,email<>$in{'email'}\,url<>$in{'url'}\,pwd<>$in{'pwd'}\,icon<>$in{'icon'}\,color<>$in{'color'}"; そして、これをprintで書き出しているのですが、なぜ消えてしまうんでしょう? 設定の仕方が間違っています?

  • Cookieの有効期限について

    Cookieの有効期限を半年間にしようと思い、 プログラムを覗いてみたところ、以下のような記述がありました。 どこをいじれば半年間に伸ばすことができるのか教えていただけますか? どうかよろしくお願いいたします。 sub set_cookie { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; $cook="name\:$FORM{'cntr'}\,email\:$FORM{'email'},pswd\:$FORM{'pswd'}"; print "Set-Cookie: TORBBS=$cook; expires=$date_gmt\n"; }

    • ベストアンサー
    • Perl
  • cookieについて教えてください。

    iswebのサーバーを借りています。 cookieの書きこみを下のような記述を試しています。 ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time + 60*60*3); @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut'); $date = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",$week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec); $mydata = "abc"; print "Set-Cookie: AAA=$mydata; expires=$date;"; print "Content-type: text/html\n"; print "\n"; print "<meta http-equiv="Set-Cookie" content="AAA=$mydata; expires=$date">"; 以下いろいろつづく。 この時にSet-Cookie: AAA=$mydata; expires=$date;";を残すとエラーが出てmetaを残すと動きます。 自分のパソコンの中では、両方動きます。 そこで教えていただきたいのですが、 javascriptのdocument.cookie、perlのSet-Cookie、metaのSet-Cookieの違いを教えてください。

    • ベストアンサー
    • Perl
  • 金・銀・白金・原油の価格は何処で見られますか??

    COMEX-金 DEC6 647.5 -14.5 COMEX-銀 SEP6 1215.0 -42.0 NYMEX-白金 OCT6 1250.5 -12.5 NYMEX-パラジウム SEP6 322.00 -4.7 NYMEX-原油 SEP6 74.10 -2.25 NYMEX-灯油 SEP6 203.00 -7.63 NYMEX-ガソリン SEP6 199.50 -17.72 CBOT-大豆 NOV6 573.75 -6.25 CBOT-もろこし DEC6 255.75 -1.00 CSCE-砂糖 OCT6 13.88 -0.11 CSCE-コーヒー SEP6 105.65 -1.45     ↑ こういうのって、どこのサイトで見られますか? 宜しくお願いします。 なるべく見やすいので。日本語希望。

  • エクセル ランダムな行、列の挿入

    エクセル、列、行の挿入 毎回ランダムにでてくる下記のようなデータがあり、 手入力で行を挿入し、データなしの部分は空欄で、月毎、~ヶ月の部分を 順番に並べてました。 自動的に並べ替えや、挿入されるの方法とかありますでしょうか。 列を挿入する方向→(7ヶ月,8ヶ月,9ヶ月,10ヶ月,11ヶ月,12か月,・・・) 空欄,7ヶ月, 9ヶ月, 15ヶ月, 17ヶ月,・・・ Apr-11, 1, 25, 9, 13,・・・ Aug-11, 5, 4, 12, 1,・・・ Sep-11, 9, 7, 13, 5,・・・ Mar-12, 9, 1, 8, 3,・・・ ・ ・ ↓行を挿入する方向(Apr-11,May-11,Jun-11,Jul-11・・・)

  • クッキーの基礎的なことについて

    print "Content-type: text/html\n\n"; #クッキーがないときの動作。 #クッキーがない場合クッキーを期限1日で発行する。 if(!$ENV{'HTTP_COOKIE'}){ #クッキーが存在する場合の動作 print "クッキーないない<br>\n"; #1時間先のグリニッジ標準時を取得し、weeksとmonthsを定義 ($gmSec, $gmMin, $gmHour, $gmMDay, $gmMon, $gmYear, $gmWDay, $gmYDay, $gmIsDst) = gmtime(time + (3600 * 24)); $gmYear += 1900; @weeks = ('Sun', 'Mon', 'Tue', 'Web', 'Thu', 'Fri', 'Sat'); @months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); #クッキーの有効期限をその日の1日後までにする $limitTime = sprintf("%s\n, %02d-%s-%04d %02d:%02d:%02d GMT",$weeks[$gmWDay], $gmMDay, $months[$gmMon], $gmYear, $gmHour, $gmMin, $gmSec); #クッキー発行 print "Set-Cookie: myBool=1; expires=$limitTime\n"; print "\n"; } else { #クッキーがあった場合の動作。クッキーありと表示するだけ。 print "クッキーあり。"; } クッキーの発行を見ると print "Set-Cookie: なんたらかんたら"; らしいのですが、printでこう書くだけでクッキーが発行できたことになるのですか? 実行しても、ただ単に例えば Set-Cookie: myBool=1; expires=Mon , 08-Aug-2005 12:11:43 GMT というようになるだけです。 初心者でまだ1度もクッキー作成成功してないのですが何がいけないのでしょうか。

    • ベストアンサー
    • Perl
  • [エクセル・VBA]縦列のユニークな情報を取り出し、横行に配置

    毎度お世話になります。エクセルのVBAの質問でございますが、文章で説明しづらいのでまず下記をご覧ください。 A列 B列 C列 D列 E列 F列 Month 業者名 摘要 記号1 記号2 金額 Nov-07 青森KK 10118 BAKK 304 386 Jan-08 岩手(株) 705 CHC 318 313 Feb-08 (有)埼玉 5685 JJG 121 9,480 Feb-08 (株)東京 40 KKI 183 216 Mar-08 (株)東京 1035 AOX 248 1,490 Mar-08 北海道 9211 FGJ 319 2,730 Apr-08 関西KK 10312 NNB 842 1,050 Apr-08 沖縄(有) 406 JJG 831 315 上記のようなA列の情報を下記のように表示させたいのです。金額の大きい順に並び替え、各行のデータが該当するMMM-YYのセルに印(今回は*ですが何でも可)をつけたいと思っております。[Month]はA3に設定されております。 F列 G列 H列 I列 J列 K列 ←列省略 金額 Nov-07 Jan-08 Feb-08 Mar-08 Apr-08 9,480 * 2,730 * 1,490 * 1,050 * 386 * ↓行省略 *のつけ方はLOOPを2つ作れば出来そうな気がしているのですが、その前段階のMMM-YYの配置の仕方が全くわかりません。[Month]はA3より始まっております。 なにとぞよろしくお願い申し上げます。