• ベストアンサー

ログファイルを更新したいのですが

ログファイルの中身が むらかみ  1,2,3 4,5,6 7,8,9 ・・・ ぽんた   a,b,c d,e,f g,h,i ・・・ しゅういち い,ろ,は に,ほ,へ と,ち,り ・・・ のようにタブ区切りのログファイルの各行2番目の項目を削除して上書き保存 むらかみ  4,5,6 7,8,9 ・・・ ぽんた   d,e,f g,h,i ・・・ しゅういち に,ほ,へ と,ち,り ・・・ という作業をするスクリプトを組みたいのですが、perlはまったくわかりませんで苦闘しております。 最終的にcronで指定時間にスクリプトを動かせるようにしたいです。 よろしくお願いします。

noname#99731
noname#99731
  • Perl
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.3

こんな感じで書くとどうでしょう。 while (<DATA>) { # タブで区切る my (@tab_split) = split( /\t/, $_ ); # 前から2番目の要素を1つだけ抜き出す splice( @tab_split, 1, 1 ); # 残った部分を出力 print OUT join( "\t", @tab_split ); }

noname#99731
質問者

お礼

ありがとうございます。 とりあえず何とかローカル環境でうまくいきました!

その他の回答 (3)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.4

私がデバッグしたいる間にatom_seedさんから適切な回答が付きましたね。 #普段phpばかり書いているのでPerlは仕事が遅い(汗 ちなみに「perl タブ区切り」で検索すると、そこそこ有用なサイトがHitします。「タブ区切りで切り出し」くらいはコピペ出来そうでした。spliceはお手元に文法リファレンス(もしくはリファレンスサイトのURL)がないと思いつかないかもしれませんが、無骨でよければforeachで回してカウンタが2以外のものを使って出力用のデータを作っても間に合います。 お手元にリファレンスをお持ちでなければ、リファレンスになりそうなサイトのURLをBookmarkしておいてください。   http://www.site-cooler.com/kwl/perl/   http://perl.misty.ne.jp/

noname#99731
質問者

お礼

お忙しいところありがとうございました。 リンク先ブックマークしておきます。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

ANo.1です。補足ありがとうございます。 >補足です。 >列はCGIで足していくのでなくなることはありません。 同じCGIでですか?(そうでないと整合が取れなくなって自滅しますけど) とりあえず全データを配列に読み込んで(もしくはファイル名をリネームしても可)元ファイルを書き込みでOPEN(&LOCK)、配列をforeachなどで順次処理するとして、処理内容は「タブ区切りで切り出し、2番目以外の結果を使って再度1行分の文字列を作成して書き込む」となります。 上記内容でどの部分がわかりませんか?

noname#99731
質問者

補足

処理内容は「タブ区切りで切り出し、2番目以外の結果を使って再度1行分の文字列を作成して書き込む」 ↑ まさにここで苦戦しております。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

#補足をお願いします。 仕様についての疑問なのですが「2番目の項目を削除して上書き保存」してしまうとcronで実行するたびに列が減っていって最後は空になりますよね?それでいいのですか?

noname#99731
質問者

補足

補足です。 列はCGIで足していくのでなくなることはありません。

関連するQ&A

  • phpでのソートについて

    phpのソートについて教えてください。 以下のようなカンマ区切りのログファイルlog.txtがあるとしまして、 100,200,a,b,c, 300,100,d,e,f, 500,60,g,h,i, 50,300,j,k,l, 1000,60,m,n,o, このデータから 1番目のデータ(数値)が2番目のデータ(数値)より大きいデーターのみを対象にして ※つまりは以下のみ対象 300,100,d,e,f, 500,60,g,h,i, 1000,60,m,n,o, ここから1番目のデータ(数値)から2番目のデータ(数値)を引いた数が大きい順に ソートしてファイルに保存させたいのですが、 200,d,e,f,(300-100なので200) 440,g,h,i,(500-60なので440) 940,m,n,o,(1000-60なので940) ↓ ※最終的にこの順番で新しいログファイルnewlog.txtへ保存させたい 940,m,n,o, 440,g,h,i, 200,d,e,f, これらの処理を効率よく1度で行う方法はございますでしょうか。 わかりにくい説明で申し訳ありません。 お忙しい中恐縮ですがご教授いただけましたら幸いです。 何卒宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PostgreSQL、外部ファイルからDBへの振り分け反映の方法

    PostgreSQL、外部ファイルからDBへの振り分け反映の方法 早速ですが質問させて頂きます。 『外部ファイル.txt』内容 ------ここから------ A B C D E F G H I 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 1 3 4 5 6 7 8 9 1 2 B C D E F G H I A 4 5 6 7 8 9 1 2 3 5 6 7 8 9 1 2 3 4 ------ここまで------ 上記のようなスペース区切りの文字ファイルがあるとして、このファイルのデータを 英字から始まる行はtable1へ、数字から始まる行はtable2へと振り分けたいです。 現在、1つのテーブルに反映させることは以下のコマンドを使用することにより可能なのですが、 2つのテーブルに振り分ける方法は全く思い浮かびません。 1つのテーブルに反映させる方法 \COPY table1 from 'C:\\~ファイルパス~\\外部ファイル.txt' delimiters ' ' null '' 下記のようなファイル内容でもかまいません。 ------ここから------ A B C D E F G H I -------------------- 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 1 3 4 5 6 7 8 9 1 2 -------------------- B C D E F G H I A -------------------- 4 5 6 7 8 9 1 2 3 5 6 7 8 9 1 2 3 4 ------ここまで------ あるいは ------ここから------ A B C D E F G H I -------------------- 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 1 3 4 5 6 7 8 9 1 2 ------ここまで------ わかる方がいらっしゃいましたらご回答いただければと思います。 また、出来ないようであれば何か参考になりそうな情報を教えていただければありがたいです。 PostreSQLのバージョンは8.2?です。 不足している情報がありましたら指摘してください。 以上です、お手数かけますがよろしくお願いいたします。

  • tcpdumpをログファイルにリダイレクトできません

    以下の様なスクリプトをRedhat9環境下のcronで回して #!/bin/bash -x LOG_FILE=/var/log/tcpudumpPop.log if [ -f $LOG_FILE ];then touch $LOG_FILE fi /usr/sbin/tcpdump -i eth0 -a -vvv \( dst port 110 and dst host hoge.dyndns.net \) \ >> /var/log/tcpdumpPop.log & として /var/log/tcpdumpPop.log にPOPアクセスに関するログを吐かせようとしています。 # ls -l /var/log/tcpdumpPop.log -rw-r--r-- 1 root root 0 11月 30 23:42 /var/log/tcpdumpPop.log # ps ax | grep tcpdump 8253 pts/2 S 0:00 [tcpdump] 10339 pts/2 S 0:00 grep tcpdump となりまして、実験的にPOPアクセスしてみても # tail -f /var/log/tcpdumpPop.log には何も表示されません。 直接 # /usr/sbin/tcpdump -i eth0 -a -vvv \( dst port 110 and dst host hoge.dyndns.net \) とした場合にはコマンドライン上にチャンと表示されます。 どうしてリダイレクトされないでしょうか?

  • ファイルから一行ずつ読み込むとき、@F[0] と $_ は違う?

    データファイルを一行ずつ読み込んで、文字列を一文字ずつコンマ区切りにしたいと思っています。たとえば、   xyz → x,y,z としたいと思っています。 今、data.txt に  abc  defgh という2行が書いてあります。  perl -nla -e '@chars= split(//,@F[1]); print join(",",@chars);' data.txt とすると  a,b,c  d,e,f,g,h という出力が無事に得られました。 どうせ、data.txt は一列しか使っていないので、 @F[0] の代りに $_ を使ってみました。  perl -nle '@chars= split(//, $_); print join(",",@chars);' data.txt しかし、結果は  a,b,c,  d,e,f,g,h, のように、各行の最後に余計なコンマが付いてしまいます。 なぜでしょうか? 一列しかデータがないので、@F[0] と $_ は同じだと思っていたのですが、なにか違うのでしょうか?

    • ベストアンサー
    • Perl
  • SPOOLのログについて

    sysユーザで入るスクリプトを作成しているのですが、そこで、ログ出力の設定をしようと考えています。 spool ログファイル名 だけだと、ログファイルは上書きされてしまうようですが、追加書きにできないでしょうか? スクリプトの頭の部分は以下のようになっています。 -------------------- setenv DAY `date '+%Y%m'` setenv LOGFILE /tmp/test_${DAY}.log sqlplus -s /nolog << EOF connect /as sysdba spool $LOGFILE --------------------- なお、毎日cronで実行し、結果を月ごとにまとめたいと考えています。 何か、いい方法があれば教えてください。

  • ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.lo

    ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.log.1を削除し、存在しなければその旨をmessagesに記述するというシェルスクリプトを作成しました。 (OSはCentOS5.4で、cronで作成したシェルスクリプトを動作させております) <シェルスクリプトの内容> #!/bin/sh DATE=`date +%Y%m%d --date '1 day ago'` i=/var/log/aaa/bbb.log j=/var/log/aaa/ccc.log cat $i.1 | grep type=ccc > $j.$DATE sed '/type=ccc/d' $i.1 > $i.100 /bin/mv $i.100 $i.$DATE /bin/gzip $i.$DATE /bin/gzip $j.$DATE if [ test -e $i.$DATE.gz ]; then if [ test -e $j.$DATE.gz ]; then rm -f $i.1 else logger -p user.info "not find ccc.log" fi else logger -p user.info "not find bbb.log" fi これを実際に動作させますと、以下のエラーが表示されます。 ./test.sh: line 15: [: -e: binary operator expected どのように記述すれば正しく動作するのでしょうか。 お手数をおかけしますが、よろしくお願い致します。

  • ファイルの読み込み

    a,b,c,d,e,f g,h,i,j,k,l のような1行に5つのデータがカンマで区切られ並んでいるテキストファイルがあります。(行数は決まっていません) これを読み込みリストビューに表示させたいのですが、うまくいきません。 誰かうまい方法を教えてください。

  • ファイルメーカーでタブを切り替えない方法

    ファイルメーカーでデザインの管理をしています。 ある特定のアイテムのデザインだけ、管理項目が増え、 また必要でない項目があるのでタブで表示する内容を切り替えています。 例として、AからIのフィールドがあり、タブ1とタブ2があるとして タブ1:A,B,C,D,E,Fのフィールドを表示(G,H,Iの項目が表示不要) タブ2:A,B,C,G,H,Iを表示(タブ1に対して,D,E,Fが不要となり、G,H,Iの項目が増えます) タブ2で作業を続けたいのですが、特定の作業(レイアウトモードに切り替える等)をすると、 タブ1の表示にもどってしまいます。 スクリプトでレコードの複製を行った時(一部の内容のみが複製されるようななっている)をした時も、新しく作られたレコードの表示がタブ1に戻ります。 入力点数が多いため、いちいちタブを切り替えるのが面倒となっております。 上記のような場合で、入力中タブが切り替わらないようにすることは可能でしょうか? 私の使用環境は iMac Core i5 Mac OS 10.8 MountainLion ファイルメーカーVer10 となります。 ご回答のほど、よろしくお願いします。

  • Microsoft excelの計算方法

    200行ほどの計算方法で2段目に単価、3段目以降は注文数。 各行に注文数と単価を掛け合わせ、最終行に数量を各行合計。、 さらに横行に数量x単価で集計をとりたいのですがエラーが出てしまいます。 エラーがでる計算式は M3=(C3*C2)+(D3*D2)+(E3*E2)+(F3*F2)+(G3*G2)+(H3*H2)+(I3*I2)+(J3*K2)+(K3*K2) L3は各行の数量計算、M3は数量x単価計。 これを短くする計算方法を教えてください。

  • マイクロソフトアクセスの抽出

    マイクロソフトアクセス2010の使い方の質問です。 次のようなテーブルがあります。 ID   名前1   名前2   名前3 1    A      B○     C 2    D○     E       F○ 3    G      H○     I○ このデータで○がついているもののみを抽出し ID   名前(○あり) 1    B○ 2    D○、F○ 3    H○、I○ このようなテーブルを作成するにはどうしたらいいですか? 各行に必ず○は1つ以上あります。 アクセスは、ド素人ですよろしくお願いします。

専門家に質問してみよう