sort コマンドだと、日本語などのマルチバイト文字を無視してソートしてしまうので、Perl でこんなスクリプトを書いておいて、msort なんかのコマンドとして保存しておくと便利。
#! /usr/bin/perl
use warnings;
use strict;
my @lines = ();
while (<>) {
push @lines, $_;
}
foreach my $line (sort @lines) {
print $line;
}
このやり方だと複数のファイルを読み込んだとき、全部をひとつの配列に突っ込んだ上でソートしてる。
#Perl #Shell #sort
SN 2013/07/08 01:04:13
Archives > Perl_multi_sort.html
Gauche のお勉強メモ。文字列処理。
整理しながらなんで全然まとまりないし改善の余地ありありですが。
;; カレントディレクトリを glob して
;; 末尾が .html のファイル名だけを取る
(filter #/\.html$/ (glob "*"))
;; 逆に .html を省く
(remove #/\.html$/ (glob "*"))
;; Perl でいうところの、
;; open my $in, "<", "file_name";
(define in (open-input-file "file_name"))
;; 1行ずつ読み込み
(read-line in)
;; Perl でいうところの、
;; close $in;
(close-input-port in)
;; ファイルの中身を丸っと読み込み
(define str
(call-with-input-file "file_name" port->string))
;; ファイルの中身を行単位でリストにして読み込み
(define lst
(call-with-input-file "file_name" port->string-list))
;; カレントディレクトリにあるファイル名のリスト
(define files (glob "*"))
;; ファイルの内容のリスト
(define values
(map
(lambda (file)
(call-with-input-file file port->string))
files))
;; files と values を組み合わせた alist
(define alist
(map
(lambda (f v)
(cons f v))
files values))
;; いやいや、まとめてやりましょう。
(define alist
(map
(lambda (file)
(cons
file
(call-with-input-file file port->string)))
(glob "*")))
;; ファイルの内容に特定の文字列を含むファイル名
(map
(lambda (lst)
(and (rxmatch #/bla bla bla/i (cdr lst))
(car lst)))
alist)
;; 但し、結果はこんな風に表示されてしまうので
;; -> ("foo.html" "bar.txt" #f #f)
;; マッチしなかった場合は結果から除く
(remove
(lambda (result)
(eq? result #f))
(map
(lambda (lst)
(and (rxmatch #/bla bla bla/i (cdr lst))
(car lst)))
alist))
;; -> ("foo.html" "bar.txt")
参考:
Scheme:テキスト処理
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme:テキスト処理
#Gauche #Scheme #Lisp #IO #Regex #Shell
SN 2013/06/30 00:59:19
Archives > Gauche_text_filter.html
ftp コマンドの操作を一個のシェルスクリプトにまとめておくと便利。
僕の場合は、あるディレクトリ内のファイルを定期的にダウンロードして解析しなくちゃいけないジョブがあるので、こんな感じのシェルスクリプトを作って自動化してる。
※ ftp のパスワードは .netrc から読み込んでる前提。
#! /bin/sh
ftp foo@bar.org <<END
cd www/some/dir
lcd /user/local/some/dir
prompt
mget *
bye
END
つまり、ftp コマンドにヒアドキュメントをそのまま実行させるというテクニック。
参考:
ftp転送をシェルスクリプトで - IT 東京 楽しいと思うこと
http://d.hatena.ne.jp/mikeda/20081027/1225121364
#ftp #ShellScript #bash
SN 2013/06/28 23:22:39
Archives > FTP_Shell_Script_Job_Automatically.html
Gauche で Shell Script や Perl のように普通のファイルかとかチェックするには、
- file-exists?
- file-is-regular?
- file-is-directory?
この辺りを使う。
(glob "*/") みたいなことも普通にできる。
こんな風に関数にまとめておくと便利かも
(define (-e x)
(file-exists? x))
(define (-f x)
(file-is-regular? x))
(define (-d x)
(file-is-directory? x))
参考:
Gauche ユーザリファレンス
6.25.3.4 ファイルの状態
6.25.3.1 ディレクトリ
#Gauche #Scheme #Lisp #Shell
SN 2013/06/28 00:49:21
Archives > Gauche_file_check.html
© 2008-2013 Basic Werk