• 締切済み

LINUXのcshについて、foreach構文の質問です。

LINUXのcshについて、foreach構文の質問です。 foreach構文で、foreach i (20XX/*.txt)として、カレントディレクトリ上の20XXフォルダに、テキストファイルが数個はいっているとします。 このとき、テキストファイルすべてのはじめから2行をのぞいてそれ以降の部分からmd5sumでハッシュをとり、その横にファイル名をそれぞれつけたいのですが。。。 とりあえず、 foreach i (20XX/*.txt) cat $i | tail -n +2 | md5sum | sort >> 20XX_hash.txt でハッシュ値がとれることは分かったのですが、、、 コレにいかにしてファイル名を付属できますか? 何か良いアイディアありませんか? よろしくお願いします。 申し訳ないですが、明日までにお願いしますOTL

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

>その横にファイル名 横って、どっち? > cat $i | tail -n +2 | md5sum | sort >> 20XX_hash.txt cat と sort必要ですか? tail -n +2 "$i" | md5sum >> 20XX_hash.txt で十分ですが。といいますか、2行除くなら3行目からですよね。それなら tail -n +3 "$i" | md5sum >> 20XX_hash.txt です。 さて、md5sumの出力は md5のハッシュ - となっているので、この頭なりおしりなりにファイル名(=$i)をくっつければいいわけです。 例えば、 sedを使う tail -n +3 "$i" | md5sum | sed "s/-/$i/" >> 20XX_hash.txt とか、 ``を使う echo `tail -n +3 "$i" | md5sum` $i >> 20XX_hash.txt とか、awkを使うとか、perlを使う(なら全部まとめてもいい)とか

関連するQ&A

  • Linuxについて

    Linuxの授業で、 『ディレクトリ20XX内のファイルとディレクトリ20YY内のファイルとの組み合わせのうち、 2行目以降の内容が同一の組み合わせを求めるシェルスクリプトを作成しなさい』 という問題が出ました。 この問題の中で、『各ファイル2行目以降のMD5値とファイル名の組をtmp/20XX_tmp.txtにまとめる』 という作業がありますが、やり方が分かりません。 2行目以降のMD5値をまとめるだけなら、 foreach i (20XX/*.txt) tail -n +2 $i | md5sum >> tmp/20XX_tmp.txt end と入力すればいいのですが....。 また、http://okwave.jp/qa/q5948919.htmlに載っているやり方でやってみても、できませんでした。 分かる人がいたら、是非教えてください。

  • csh foreachで「*」でエラーとなる

    シェルの初心者です。よろしくお願い致します。 cシェル(csh)で、リストをforeachで1行ずつ取得しているのですが、「*(アスタリスク)」の値があると「一致しません」とエラーで落ちてしまいます。 「*(アスタリスク)」も正常に読んで、ループを回すことはできないのでしょうか? foreach FILE ( \"`/bin/cat リストファイル名`\" ) リストは「|(パイプ)」区切りにしてあります。 foreachで一行ずつ、読んでループしています。 ご存知の方は、お力をお貸し下さい。 よろしくお願い致します。

  • foreach構文をwhile構文で実現したい。

    下記にありますforeach構文をwhile構文で実現しようと試みているのですが 何故か同じように実現できず、無限ループになっているような気がします。 どこに問題があるのか当方ではわからない為、どなたかご教授いただけませんでしょうか。 ------------------------------ $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD ------------------------------ ■成功版 open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { chomp; ($a, $b) = split(/<>/, $_);#$_は省略できます。 print OUT "'$a'=>'$b',\n"; } close(OUT); ■取組版 open(IN, "<list1.txt"); @datas2 = <IN>; close(IN); open(OUT, ">date2.txt"); while (@datas2) { s/^/'/; s/<>/'=>'/; s/$/',/; print OUT; } close(OUT);

    • ベストアンサー
    • Perl
  • csh で入れ子変数

    csh で入れ子にした変数を使いこなせません。 例えば、 set i=0 set n=9 while ( $i <= $n ) set a_${i}=${i} (← 入れ子にした変数) cat <<EOF >>out.txt eval echo '$'a_${i} EOF end 期待している出力としては、out.txt に 1 2 3 ... としたいのですが、実際には「変数名の頭は英数字で」と 怒られ、うまくいきません。ご教授していただけないでしょうか?よろしくお願いします。

  • cshが詳しい方は教えてください

    cshが詳しい方は教えてください cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが foreach f_list("`cat tmp.out`") echo "${f_list}" end tmp.outの内容は以下です。 test3 if ( 0==mencmp("H",HOSTN,10) { test345 testddd … 2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。 『}が足りません。』ってのエラーになっちゃう、 "{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか 以上です。よろしくお願いいたします。

  • 【初歩的質問】重複データがある時のハッシュへの代入について

    perl5.8です。すごくしようもない質問で申し訳ないのですが、次のようなファイルfile.txtの内容を、ハッシュ%hashに入れていくとします。 --- file.txtの中身 --- a,1 c,3 a,1 b,2 c,3 ----------------------- --- ソース(抜粋) ----- open(IN, "file.txt"); @data = <IN>; close(IN); %hash = (); foreach(@data){ chomp $_; @out = split(/,/, $_); $hash{$out[0]} = $out[1]; } ----------------------- 上記の結果は当然ながら、$hash{a}=1,$hash{c}=3,$hash{b}=2となるのですが、重複したデータを読み込んでハッシュに入れようとした時に、ワーニングなりエラーがなにも出なかったのがちょっと気持ち悪いです。重複したキーを読み込んだ時は、内部的には黙ってはじいてくれていると解釈してよいのでしょうか?そうだとすると、こういう書き方は、重複した行を排除するテクニックとなりえるのでしょうか?

  • シェルでファイルのハッシュを取得する方法

    シェル(.shのファイル)でフォルダに格納されている複数のファイルからファイル名、ハッシュをとって HASH.txtというファイルに以下のようなレイアウトで作りたいのです。  ファイル名,ハッシュ     ・     ・ MD5というコマンドをつかえばハッシュがとれることは わかったのですが、これをどのようにファイルに書き込んでいくのか 方法がわかりません。 当方、UNIXをつかうのも初めてでどうしたらよいのか全然わかりません。(依頼してきた人も長期休暇中で困ってます) どこかサンプルや、解説があるようなHPでも構わないので どなたか教えてください。

  • Cygwin上でCシェルのforeachが動かない……

    今回UNIX上の機能をWindows上で実現できる 「Cygwin」というものをインストールしました。 あるプログラムa.outを同じディレクトリにあるxmlファイル全てに対して実行したかったので #!/bin/csh foreach i(*.xml) ./a.out $i end というk.shファイルを作り csh k.sh で実行してみたのですが最初に見つかったと思われる一つのxmlファイルにしかa.outが実行されません。 スクリプトの書き方に問題があるのでしょうか? それともプログラム……? ここを利用するのは初めてですが、どうぞよろしくお願いします。

  • cshで拡張子を除いたファイル名を取得したい

    cshにてファイル名から拡張子を除いた文字列を取得したいと思っています。 例えば abc.txt -> aaa defg.log -> defg といった具合に。 *ファイル名の長さは固定長ではないです。 *拡張子の長さもできれば3文字固定にはしたくないです。(無理なら固定でもやむを得ませんが) 何か簡単でいい方法はないものでしょうか? 知恵を貸してください。 よろしくお願いします。

  • 2つの画像ファイルが異なるファイルだと判定したい

    PHPを使って2つの画像ファイルが異なるファイルであることを判定するプログラムを考えています。以下のように、画像ファイルを文字列として扱い、md5ハッシュ値を取得し、それを比較することで、画像ファイルが違うということを判別しています。 こちらですが、もし他に良いロジックをご存知の方がいらっしゃいましたら、ご意見いただければと思います。 よろしくお願いいたします。 <?php $hash1 = getMD5('hoge1.jpg'); $hash2 = getMD5('hoge2.jpg'); if ($hash1 == $hash2) { echo "同じ画像ファイルです。"; } else { echo "同じ画像ファイルではありません。"; } // 画像ファイルを文字列として扱い、 // md5ハッシュ値を取得する関数 function getMD5($image) { $fp = fopen($image, 'r'); $str = ''; while(!feof($fp)) { # 画像ファイルを1行ずつ読み込んで、文字列にする $str .= fgets($fp); } fclose($fp); // $strのmd5ハッシュ値を得る return md5($str); } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう