プログラミングメモ

chmod

階層的にファイルのパーミッションを変更したい:


% find . -type d -exec chmod 775 {} \; # ディレクトリの場合
% find . -type f -exec chmod 664 {} \; # ファイルの場合
				

diff

タブ・スペースを無視して比較したい:


% diff -w file1.txt file2.txt
				

EXCEL

文字列の結合:


="| "&A2&" | "&B2&" | "&C2&" |"
				

空白ではないセルの個数:


=COUNTA(A2:A10)
				

条件:


=IF(A2>10,"該当","非該当")
=IF(OR(A2=5,A2=10),A2,"-") # A2セルが5または10
=IF(AND(A2>=10,A2<=30),A2,"-") # A2セルが10~30の範囲
=IF(A2="mogi","○") # A2セルがmogi
				

セルの参照:


=INDIRECT("A2") # A2のセルを参照する
=INDIRECT("A"&RANDBETWEEN(2,COUNTA($A$2:$A$10)+1)) # A列からランダムに情報を取り出す
				

セルの先頭や末尾のスペース削除、2つ以上のスペースを1つだけ残す:


=TRIM(A2)
				

文字列置換:


=SUBSTITUTE(A2," "," ") # 全角スペースを半角スペースに置換
				

文字列分割(一つのセルにパイプ区切りで2カラム分の文字列が入っている場合):


=LEFT(A2,FIND("|",A2)-1) # パイプ左側
=MID(A2,FIND("|",A2)+1,LEN(A2)) # パイプ右側
				

文字列分割(一つのセルにハイフン区切りで3カラム分の文字列が入っている場合):


=LEFT(A2,FIND("-",A2)-1)
=MID($A2,FIND("-", $A2)+1,FIND("-", $A2,FIND("-", $A2)+1)-FIND("-", $A2)-1)
=RIGHT($A2,LEN($A2)-FIND("-", $A2,FIND("-", $A2)+1))
				

0以上、1未満の乱数:


=RAND()
				

範囲指定した乱数の発生:


=RANDBETWEEN(1,10) # 1~10までの乱数を発生させる
				

順位、ランキング:


=RANK(A2,A$2:A$10) # 2番目のパラメータは絶対参照
				

順位・ランキングで上位3までを表示:


=IF(RANK(B2,B$2:B$99)<=3,RANK(B2,B$2:B$99),"")
				

文字列を数値に変換する:


=VALUE(A2)
				

書式の設定(茂木ネットワークセンター標準日付表記):


yyyy-mm-dd(aaa)
				

書式の設定(1000分の1秒まで表記):


mm:ss.000
				

dd-mm-ssまたはddd-mm-ss形式の経緯度を秒数形式に変換:


=(LEFT(A2,FIND("-",A2)-1)*3600)+(MID($A2,FIND("-", $A2)+1,FIND("-", $A2,FIND("-", $A2)+1)-FIND("-", $A2)-1)*60)+(RIGHT($A2,LEN($A2)-FIND("-", $A2,FIND("-",$A2)+1)))
				

秒数形式の経緯度をdd-mm-ssまたはddd-mm-ss形式に変換:


=INT(A2/3600) & "-" & TEXT(INT(MOD(A2,3600)/60),"00") & "-" & TEXT(MOD(A2,60),"00")
				

FileMaker Pro

FileMaker Proのスクリプトからシェルスクリプトを実行(macOS版)


# 単純に実行する場合
# →AppleScript記述にて
do shell script "~/bin/program.tcsh"

# フィールドの内容をシェルスクリプトの引数として実行する場合 # →計算済みのAppleScriptにて "do shell script \"~/bin/program.tcsh " & GetAsText(テーブル名::フィールド名) & "\""

FileMaker Proのスクリプトからバッチファイルを実行(Windows版)


# 単純に実行する場合
# →Eventを送信・テキスト記述にて
CMD /C c:\bat\program.bat

# フィールドの内容をバッチファイルの引数として実行する場合 # →Eventを送信・計算にて "CMD /C c:\bat\program.bat " & GetAsText(テーブル名::フィールド名) & ""

FileMaker ProのスクリプトからWSLのシェルスクリプトを実行(Windows版)


# 単純に実行する場合
# →Eventを送信・テキスト記述にて
WSL tcsh /home/bin/program.tcsh

# フィールドの内容をシェルスクリプトの引数として実行する場合 # →Eventを送信・計算にて "WSL tcsh /home/bin/program.tcsh " & GetAsText(テーブル名::フィールド名) & ""

コメント行:


#
				

ffmpeg

動画ファイルの一部分を抽出する:


% ffmpeg -ss 00:08:26 -to 00:10:10 -i video.wma -c copy kirinuki.wma
				

音声ファイルに1枚のサムネイル画像を付けて動画ファイルにする:


% ffmpeg -i thumbnail.png -i audio.wav -vcodec libx264 -pix_fmt yuv420p output.mp4
				

複数の画像ファイル(ファイル名はスライド+数字.png)をスライドショーっぽい動画ファイルにする:


% ffmpeg -r 1/5 -i ./スライド%d.png -vcodec libx264 -pix_fmt yuv420p output.mp4 # 5秒間隔で表示
				

複数(ここでは4つ)の画像ファイルをクロスディゾルブ/クロスフェードを使ってスライドショーっぽい動画ファイルにする:


% ffmpeg \
    -loop 1 -t 1.5 -i input1.png \
    -loop 1 -t 1.5 -i input2.png \
    -loop 1 -t 1.5 -i input3.png \
    -loop 1 -t 1.5 -i input4.png \
    -filter_complex \
        "[0:v]format=rgba[v0]; \
         [1:v]format=rgba[v1]; \
         [2:v]format=rgba[v2]; \
         [3:v]format=rgba[v3]; \
         [v0][v1]xfade=transition=fade:duration=0.5:offset=1[xf1]; \
         [xf1][v2]xfade=transition=fade:duration=0.5:offset=2[xf2]; \
         [xf2][v3]xfade=transition=fade:duration=0.5:offset=3[xf3]" \
    -map "[xf3]" \
    -r 30 -pix_fmt yuv420p output.mp4
				

find

カレントディレクトリ以下の.jpgファイルをホームディレクトリのworkディレクトリに移動する:


% find ./ -name \*.jpg -exec mv {} ~/work \;
				

macOSからLinuxなどへコピーしたファイルに含まれる不可視(隠し)ファイルを抽出する:


% find ./ \( -name ".DS_Store" -or -name "._*" \) -ls
				

カレントディレクトリ以下のファイルをタイムスタンプ+相対パスで表示する(bsd系):


% find . -print0 | xargs -0 stat -f '%Sm %N'
				

gawk(awk)

テキストファイルの3カラム目が空白でない行を表示する:


% gawk '$3 != ""' filename.txt        # 区切り文字はスペース
% gawk -F'\t' '$3 != ""' filename.txt # 区切り文字はタブ
				

grep

階層検索:


% grep 'mogi' -r ./ --include "*.pl"
				

複数ファイル検索時、ファイル名を表示しない:


% grep 'h1' -h *.html
				

除外:


% grep 'mogi' *.tcsh | grep -v 'home'
				

OR検索:


% grep -e 'DCM' -e 'KDDI' -e 'SBM' filename.txt
				

検索結果(マッチング部分)に色付けをする:


% grep 'mogi' --color=auto *.tcsh
				

マッチング部分のみを表示する:


grep -o 'boundary=[\!-z]\+' filename.txt
				

検索結果に行番号を表示する:


% grep -n 'mogi '*.tcsh
				

検索結果の前後の行も表示する:


% grep -3 'mogi' *.tcsh # 前後3行を表示する
				

検索結果の前一行のみを表示する:


% grep -B 1 'mogi' filename.txt | awk '{print; getline; getline}'
# ただし、1行目に検索文字列がヒットした場合はうまく表示されない
				

連続した2行がマッチングするかどうか($statusが0でマッチング):


% grep -A 1 'set c1="DCM"' program.tcsh | grep -q 'set c2="KDDI"'
% echo $status
				

head(tail)

テキストファイルの3行目をのみを表示する(3行以上あることが前提):


% head -3 filename.txt | tail -1
				

ImageMagick(convert,magick)

画像ファイルに日本語の文字を挿入する(重ね合わせる):


# Windows版ImageMagickの例
> magick input-image.png -fill #595959 -font "Meiryo-&-Meiryo-Italic-&-Meiryo-UI-&-Meiryo-UI-Italic"
-pointsize 96 -gravity Center -annotate +0+50 "こんばんは" output-image.png
				

等倍で拡大する(ぼやけないように拡大する):


% magick -scale 200% input.png output.png
				

指定したサイズの中に画像を収める(下記例は1080x1920の縦長画像枠の中に縦横比を維持したまま画像を挿入する):


% magick input.jpg -auto-orient -resize 1080x1920\> -gravity center -background black -extent 1080x1920 output.png
				

join

項目をキーとしてテキストファイルを結合する:


% join -t "," -1 1 -2 1 -o 1.1,1.2,2.2 master.txt transaction.txt
				

※master.txt、およびtransaction.txtのキー(ここではどちらも1カラム目)は、あらかじめソートされていなければならない。

※タブ区切りにする場合は、\tではなく、そのままタブを入力する。入力できない場合は、<ctrl+v><tab>キーを押す。

ln

シンボリックリンクを張る:


% ln -s /home/mogi/bin bin
				

mariadb

ユーザー・データベース作成、権限設定:


% vim createdb.sql
CREATE USER db_admin IDENTIFIED BY 'password' ;
CREATE DATABASE pdm DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ;
GRANT ALL PRIVILEGES ON pdm.* TO db_admin ;
FLUSH PRIVILEGES ;

% mariadb -u root -p Enter password:
> \. createdb.sql

タブ区切りテキストデータを一括インポートする:


% vim import.sql
LOAD DATA LOCAL INFILE "import_data.txt"
INTO TABLE parts_tbl
FIELDS TERMINATED BY '\t' ;

% mariadb pdm -u db_admin -p Enter password:
> \. import.sql

現在のデータベースを表示する:


> SELECT DATABSE() ;
				

テーブルの構造を表示する:


> DESC parts_tbl ;
				

テーブル一覧を表示する(Oracle DatabaseのUSER_TABLES相当):


> SHOW TABLES ;
				

OSのコマンドラインからSQLを実行する:


% mariadb pdm -u db_admin -p < sqlfile.sql
Enter password:
				

more

最終行を表示したらmoreを自動的に終了:


% ls -la | more -e
				

nkf

SHIFT-JISからUTF-8へ、改行コードはLFに変換(旧MacやWindows→UNIX)。
UTF-8からSHIFT-JISへ、改行コードはCRに変換(UNIX→旧Mac)。
UTF-8からSHIFT-JISへ、改行コードはCRLFに変換(UNIX→Windows)。
SHIFT-JISからSHIFT-JISへ、改行コードはCRLFに変換(旧Mac→Windows)。
UTF-8からEUCへ、改行コードはLFに変換(UNIX→旧UNIX)。


% nkf -S -w -Lu filename_sjis.txt > filename_utf8_lf.txt
% nkf -W -s -Lm filename_utf8.txt > filename_sjis_cr.txt
% nkf -W -s -Lw filename_utf8.txt > filename_sjis_crlf.txt
% nkf -S -s -Lw filename_sjis.txt > filename_sjis_crlf.txt
% nkf -W -e -Lu filename_utf8.txt > filename_euc_lf.txt
				

WindowsのSHIFT-JISからUTF-8へ、改行コードはCRLFに変換(Windows→新Windows)
WindowsのSHIFT-JISからUTF-8へ、改行コードはLFに変換(Windows→UNIX)


nkf --ic=CP932 --oc=UTF-8 -Lm filename_cp932.txt > filename_utf8_crlf.txt
nkf --ic=CP932 --oc=UTF-8 -Lu filename_cp932.txt > filename_utf8_lf.txt
				

※注意:--ic=UTF-8を誤って--ic=UTF8(ハイフン抜き)と指定すると、エラーは表示されませんが、誤動作します。

HTMLの特殊文字(><”&)を&gt;&lt;&quot;&amp;に変換する:


% nkf -Z3 filename.html > filename_html.html
				

MIMEデコード:


% echo "=?ISO-2022-JP?B?GyRCJU0lQyVIGyhC?=" | nkf -J -wm
ネット

% echo "=E3=83=8D=E3=83=83=E3=83=88" | nkf -W -wmQ ネット
% echo "44ON44OD44OICg==" | nkf -W -wmB ネット

od

16進数で表示する:


% od -vtx1 mo.txt
				

osascript(macOS固有)

ダイアログを表示:


% osascript -e 'display alert "終了しました."'
				

OKとキャンセルボタンのあるダイヤログを表示:


% osascript -e 'display dialog "進みますか?"'
				

入力:


% osascript -e 'display dialog "間隔を入力してください." default answer "1"'
				

pbcopy、pbpaste(macOS固有)

クリップボードへコピー:


% ls | pbcopy
				

クリップボードからペーストする:


% pbpaste > clip.txt
				

perl

標準入力:


while (<STDIN>) { # 変数$_に代入される
    chomp ;       # 変数名を指定しない場合は$_が対象
    print "読み込みデータは $_ です。\n" ;
}
				

パターンマッチ:


if ($line =~ /茂木ネットワークセンター/) {
}
				

パターンマッチした部分を抽出:


if ($line =~ /[!-z]*\.jpg/) {
    $fn = $& ;
}

$pattern = 'https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+' ; while(<STDIN>) { if ($_ =~ /$pattern/gp) { print ${^MATCH} ; } }

文字列置換:


$line =~ s/茂木/mogi/g ; # 通常の置換
$line =~ s/<.*?>//g ; # HTMLタグを削除
$line =~ s/^\s*//; # 先頭のスペースを削除
$line =~ s/(http|https):\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?//g ; # URLを削除
$line =~ s/[\x{10000}-\x{3ffff}\x{40000}-\x{fffff}\x{100000}-\x{10ffff}]/\x{3013}/g ; # 絵文字を〓に置き換える
				

文字列変換(大文字/小文字):


$str = uc $str ; # 大文字変換
$str = lc $str ; # 小文字変換
				

ファイル書き込み:


open(OUT, ">", "filename.txt") ;
print OUT "茂木ネットワークセンター\n" ;
close(OUT) ;
				

ファイル読み込み:


open(IN, "<", "filename.txt") ;
while (<IN>) {
    chomp ;
    print "読み込みデータは $_ です。\n" ;
}
close(IN) ;
				

文字列分割(カンマ区切り):


$line = "mogi,2019,15" ;
@strlist = split(/,/,$line) ;
print "$strlist[0]\n" ;
print "$strlist[1]\n" ;
print "$strlist[2]\n" ;

$line = "mogi,2019,15" ; ($name,$year,$num) = split(/,/,$line) ; print "$name\n" ; print "$year\n" ; print "$num\n" ;

文字列分割例(カンマ、タブ、スペース、パイプ、垂直タブ、複数の区切り文字):


@strlist = split(/,/,$line) ;    # カンマ区切り
@strlist = split(/\t/,$line) ;   # タブ区切り
@strlist = split(/ /,$line) ;    # スペース区切り
@strlist = split(/\s+/,$line) ;  # 複数のスペースにも対応
@strlist = split(/\|/,$line) ;   # パイプ区切り
@strlist = split(/\x0b/,$line) ; # 垂直タブ区切り(FileMakerのフィールド内改行等)
@strlist = split(/:|;/,$line) ;  # コロン・セミコロン区切り
				

文字列分割(一部のフィールドを無視。COBOLのDATA DIVISIONのFILLERみたいな感じ):


($name,undef,$num) = split(/\t/,$_) ;
				

文字列分割時の要素数:


$line = "DCM,KDDI,SBM,RAKUTEN" ;
$strlist = split(/,/,$line) ;
print "$strlist\n" ;
				

文字列結合・連結:


# 経度変換(DDD-MM-SSをDDD.MMSSにする)
$lon = "139-03-39" ;
$lon = substr($lon,0,3) . "." . substr($lon,4,2) . substr($lon,7,2) ;

# .= で結合する $str = "MOGI " ; $str .= "NETWORK " ; $str .= "CENTRE\n" ; print $str ;
# 文字列を繰り返し連結する $str = "MOGI" x 3 ;
# 区切り文字付きで結合 $str = join(",",@strlist) ;

16進数関係:


$code = 0xe21a ;        # 16進数を数値として変数に代入する
$code = hex("0xe21a") ; # 文字列の16進数を数値として変数に代入する
$code = hex("e21a") ;   # 文字列の16進数を数値として変数に代入する
printf("%X\n",$code)    # 16進数で表示する
				

文字コード関係(Unicode):


use Encode ;
use utf8 ;
printf("%X\n",ord("あ")) ;                  # "3042"(Unicode)が表示される
print Encode::encode('UTF-8',chr(0x3042)) ; # "あ"が表示される
				

文字コード関係(UTF-8):


$code = "\xe3\x81\x82" ; print $code ;      # "あ"が表示される
$code = pack("H*","e38182") ; print $code ; # "あ"が表示される
print unpack("H*", $code) ;                 # "e38182"が表示される
print uc(unpack("H*", $code)) ;             # "E38182"が表示される
				

並び替え・ソート:


# 数値・昇順
@freq = (83.2, 80.3, 81.6, 85.1, 80.7, 82.5, 81.9) ;
@sorted = sort {$a <=> $b} @freq ;
print join(",",@sorted)."\n" ;

# 数値・降順 @freq = (83.2, 80.3, 81.6, 85.1, 80.7, 82.5, 81.9) ; @sorted = sort {$b <=> $a} @freq ; print join(",",@sorted)."\n" ;
# 文字列・昇順 @name = ('NHK', 'NTV', 'EX', 'TBS', 'TX', 'CX') ; @sorted = sort {$a cmp $b} @name ; print join(",",@sorted)."\n" ;
# 文字列・降順 @name = ('NHK', 'NTV', 'EX', 'TBS', 'TX', 'CX') ; @sorted = sort {$b cmp $a} @name ; print join(",",@sorted)."\n" ;
# アナログチャンネル順でソート @channel = ( [1,1,'G'], [2,3,'E'], [4,4,'NTV'], [5,10,'EX'], [6,6,'TBS'], [7,12,'TX'], [8,8,'CX'] ) ; @sorted = sort {$a->[1] <=> $b->[1]} @channel ; foreach $str (@sorted) { print "@$str\n"; }

文字列比較演算子:


if ($carrier eq "SBM")  { } # $carrierは"SBM"である
if ($carrier ne "KDDI") { } # $carrierは"KDDI"でない
				

論理演算子:


if ($freq >= 76.0 && $freq <= 96.0) { }         # $freqが76.0から96.0の範囲の場合
if ($kind eq "DCM2.1" || $kind eq "DCM800") { } # $kindが"DCM2.1"または"DCM800"の場合
				

文字列の書式:


$htmldatetime = sprintf("%04d-%02d-%02dT%02d:%02d:%02d+09:00",2022, 3, 13, 8, 26, 0) ; # ゼロ埋め
				

カンマ・ダブルクォーテーション・改行を含むCSVファイルを列に分離(http://www.din.or.jp/~ohzaki/perl.htmより拝借):


while (my $line = <DATA>) {
    $line .= <DATA> while ($line =~ tr/"// % 2 and !eof(DATA)) ;
    $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/ ;
    @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
        ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g) ;
}
				

文字列からファイル名の抽出:


use File::Basename ;
$fn = "/home/mogi/bs.jpg" ;
$filename = basename($fn) ; # 拡張子を含むファイル名を抽出する
print "$filename\n" ;
				

乱数の発生:


$a = int(rand(10)) ; # 0~9の乱数
$b = int(rand(10))+1 ; # 1~10の乱数
				

乱数の初期化(N88-BASICのRANDOMIZE相当):


srand 12345 ;
				

for構文:


for ($i = 0 ; $i <= 255 ; $i++) {
}
				

foreach構文と配列:


@strlist = split(/,/,$_) ;
foreach $str (@strlist) {
    print "$str\n";
}

@strlist = split(/,/,$_) ; foreach $str (@strlist[1..$#strlist]) { # 2番目の配列から最後まで print "$str\n"; }

複数の配列:


@str = @field[1..7] # 2番目から8番目の配列
@str[1..3] = @field[3..5] ;
				

ループ処理:


last ; # ループ処理を終了する・脱出する
next ; # 次のループに進む
				

日付・時刻関係:


# 日付・時刻を利活用できるように変換する
use DateTime;
$dt = DateTime->new(
    year => 2022 ,
    month => 6 ,
    day => 17 ,
    hour => 8 ,
    minute => 26 ,
    second => 0 ,
) ;
# 曜日(省略形)、月(省略形)、日、時:分:秒、年(4桁)を表示する(MBOX形式のヘッダーのように)
print "From - " . $dt->strftime("%a %b %d %H:%M:%S %Y") . "\n" ;
				

現在時刻を取得する:


use POSIX qw(strftime);
$current_time = strftime("%Y-%m-%d %H:%M", localtime());
				

月の略称形式を数値に変換する:


$str = "Aug" ;
$month = (index 'JanFebMarAprMayJunJulAugSepOctNovDec', $str) / 3 + 1 ;
print "$month\n" ;
				

引数:


$option1 = $ARGV[0] ; # 1番目の引数
$option2 = $ARGV[1] ; # 2番目の引数

($option1,$option2) = @ARGV ; # 上記と内容は同じ

引数を使ったループ処理(引数の数が不定の場合など):


foreach $str (@ARGV) {
    print $str . "\n" ;
}
				

サブルーチン:


# 秒数から緯度、経度に変換する
sub sec2latlon {
    my ($sec) = @_;

my $hh = int($sec / 3600); my $mm = int(($sec % 3600) / 60); my $ss = $sec % 60;
my $fmt = sprintf("%d-%02d-%02d",$hh,$mm,$ss) ;
return($fmt); }

戻り値が複数あるサブルーチン:


# 緯度、経度を秒数に変換する
($y_sec,$x_sec) = &latlon2sec("36-23-15","139-03-49") ;

sub latlon2sec() { my ($lat,$lon) = @_ ; my ($y,$x) ;
$y = substr($lat,0,2) * 3600 + substr($lat,3,2) * 60 + substr($lat,6,2) ; $x = substr($lon,0,3) * 3600 + substr($lon,4,2) * 60 + substr($lon,7,2) ;
return($y,$x) ; }

OSコマンドの実行:


# リターンコード(実行ステータス)を取得する場合
$return_code = system("grep '^From ' filename.txt") ;
$return_code = $return_code >> 8 ;
print $return_code ;

# 実行結果を取得する場合 @str = `ls` ; print @str ;

色を付けて表示する:


use Term::ANSIColor ;

print color('red') ; print "赤\n" ; print color('reset') ;
print color('on_blue white') ; print "反転青+白\n" ; print color('reset') ;

TAB区切りのデータを、固定長形式で出力する:

perl+sqlite3

PerlからSQLiteの利用ドキュメント:

PerlからSQLiteを使用するためのサンプルコード:


# データベース使用宣言・データベース接続
use DBI;
$dbh = DBI->connect("dbi:SQLite:dbname=./code.db") ;

# テーブル削除後、作成 $dbh->do("DROP TABLE IF EXISTS code_tbl") ; $dbh->do("CREATE TABLE code_tbl (kanjicode, unicode, utf8)") ;
# タブ区切りのテキストファイルからデータを読み込み、テーブルに挿入する open(IN, "<", "./code.txt") ; while ($line = <IN>) { chomp $line ; ($in_kanjicode, $in_unicode, $in_utf8) = split(/\t/,$line) ; $dbh->do("INSERT INTO code_tbl (kanjicode, unicode, utf8) VALUES ('$in_kanjicode', '$in_unicode', '$in_utf8');"); } close(IN);
# 特定のデータを1件のみ抽出して表示する $str = "8160" ; ($rst_kanjicode, $rst_unicode, $rst_utf8) = $dbh->selectrow_array("SELECT kanjicode, unicode, utf8 FROM code_tbl WHERE kanjicode = '$str';") ; if (defined $rst_kanjicode) { print "検索結果→$rst_kanjicode,$rst_unicode,$rst_utf8\n" ; }
# 複数レコードを抽出して表示する $sth = $dbh->prepare("SELECT kanjicode, unicode, utf8 FROM code_tbl ORDER BY unicode;") ; $sth->execute() ; while (@row = $sth->fetchrow_array) { ($out_kanjicode, $out_unicode,$out_utf8) = @row ; print "$out_kanjicode,$out_unicode,$out_utf8\n" ; }
# データベース接続を終了する $dbh->disconnect;

python

タブ区切りのテキストファイルを一行ごとに読み込み、既存のEXCELワークシートに書き込む:


import openpyxl

# ファイル名を指定する txt_filename = 'base_station.txt' xlsx_filename = 'base_station.xlsx'
# 既存のEXCELファイルを開く workbook = openpyxl.load_workbook(xlsx_filename) sheet = workbook.active
# テキストファイルを行ごとに読み込み、EXCELワークシートに書き込む with open(txt_filename, 'r') as file:
# EXCELワークシートの2行目から書き込む row_num = 2
for line in file:
# 行をタブで分割して、3つのフィールドに分ける fields = line.strip().split('\t')
# フィールドをA列、B列、C列に追加する sheet.cell(row=row_num, column=1, value=fields[0]) sheet.cell(row=row_num, column=2, value=fields[1]) sheet.cell(row=row_num, column=3, value=fields[2])
row_num += 1
# EXCELファイルを保存し、閉じる workbook.save(xlsx_filename) workbook.close()

rm

スペースを含むファイル名を削除:


% rm "2022年 計画書.txt"
				

ハイフンで始まるファイル名を削除:


% rm ./-a
				

sed(BSD系)

1行目のコメントアウトを削除する:


% sed -i '' '1s/^#//g' filename.ini
				

sort

文字コード順でソート:


% setenv LC_ALL C
% sort filename.txt
				

文字コード順でソート(スリムな方法):


% cat filename.txt | env LC_ALL=C sort
				

英字は大文字小文字の区別を付けないでソート:


% setenv LC_ALL C
% sort -f filename.txt
				

2列目が数字のテキストファイル(区切り文字はタブ)で降順にソート:


% sort -k 2 -n -t "\t" -r filename.txt
				

sqlite3

テーブル構造、インデックスの表示(Oracle Databaseのdescやuser_tables、user_indexesなどに相当):


> .schema
				

sqlite3を終了する:


> .q
				

GROUP BYの際に文字列を連結する:


# カンマ区切り
> SELECT pref,GROUP_CONCAT(name) FROM master GROUP BY pref;

# セミコロン区切り > SELECT pref,GROUP_CONCAT(name,';') FROM master GROUP BY pref;

今日の日付・現在の時刻を得る:


> SELECT STRFTIME('%Y-%m-%d', CURRENT_TIMESTAMP, 'localtime'), STRFTIME('%H:%M', CURRENT_TIMESTAMP, 'localtime') ;
				

日付を数値に変換する:


> SELECT JULIANDAY('2022-12-08') ;
				

OSのコマンドラインからSQLを実行する:


% sqlite3 database.db < sqlfile.sql
				

タブ区切りのデータをインポートするSQL文の例:


% vi sqlfile.sql
DROP TABLE IF EXISTS master;
CREATE TABLE master ( code INTEGER, pref TEXT );
.mode tab
.import pref.txt master
.quit

% sqlite3 database.db < sqlfile.sql

SELECT時の区切り文字をtabにする:


.mode tab
				

SELECT結果をファイルに保存する(Oracle SQL*PlusのSPOOL相当):


.output filename.txt
SELECT * FROM master;
				

SELECT結果を画面表示に戻す:


.output stdout
				

シングルクォーテーションのエスケープ処理:


INSERT INTO master(memo) VALUES('User''s') ;
				

strings

バイナリーファイル中のテキスト文字を抽出する:


% strings filename.webloc | grep http
% strings -td filename.textclipping | grep DOCTYPE # Debianのstringsコマンド
				

tail

テキストファイルを逆順で表示する:


% tail -r filename.txt
				

2行目以降を表示する:


tail -n +2 filename.txt
				

tcsh、共通コマンド

引数チェック:


if ($#argv == 2) then
    if (${argv[1]} == "secret") then
        set option = "secret"
    else if (${argv[1]} == "normal") then
        set option = "normal"
    else
        echo "usage: filename.tcsh <normal|secret> <number>"
        exit 1
    endif
else
    echo "usage: filename.tcsh <normal|secret> <number>"
    exit 1
endif
				

日付・時刻:


set yyyymmdd = `date '+%Y-%m-%d'`
set hhmmss   = `date '+%H:%M:%S'`
				

テキストファイルの中身を変数に設定:


set yyyymmdd = `cat date.txt`
set hhmmss   = `cat time.txt`
				

キー入力を待つ(下記の例はMS-DOSバッチファイルのPAUSEに相当):


read -n 1 -p "Press any key to continue ..."
				

キー入力を待つ(入力が無い場合でもタイムアウトさせる場合):


read -t 5 -n 1 -p "Press any key to continue ..."
				

Enterキーが押されるまで待つ:


set input=$<
				

foreach構文:


foreach filename (${argv[2-$#argv]})
    echo ${filename}
end

foreach filename (`ls`) echo ${filename} end

パス名・ファイル名の取得:


set fn="/home/mogi/filename.txt"
echo $fn:h   # パス名のみ
echo $fn:t   # ファイル名+拡張子
echo $fn:e   # 拡張子のみ
echo $fn:r   # 拡張子を除く
echo $fn:t:r # ファイル名のみ
				

直前のディレクトリに戻る:


% cd -
				

階層途中のディレクトリも作成する:


% mkdir -p backup/bin
				

ヒストリーの削除:


% history -c
				

色を付けて表示する:


% printf "\033[35mパープル\033[m"
% printf "\033[37;40m白文字+黒反転\033[m"
				

vim

閲覧時のエンコーディング切り替え(SHIFT-JIS、EUC、UTF-8)


:e ++encoding=sjis
:e ++encoding=euc-jp
:e ++encoding=utf8
				

.vimrc(タブ4文字分、改行コード自動認識、検索時大文字小文字の区別なし、ルーラ表示)


"コメント行はダブルクォーテーション
set tabstop=4
set shiftwidth=4
set fileformats=unix,dos,mac
set ignorecase
set ruler
				

範囲指定してインデント変更:


v
範囲指定
>
				

改行を句点に置き換える(改行の削除):


:1,$s/\n/、/g
				

句点を改行に置き換える(改行の挿入):


:s/、/\r/g
				

ソート(通常、大文字/小文字区別無し、重複削除、数字):


:sort
:sort i
:sort u
:sort n
				

便利なコマンド(行番号の表示/非表示、改行・タブの表示/非表示):


:set number
:set nonumber
:set list
:set nolist
				

ウインドウの分割、移動:


画面分割:<CTRL+W><CTRL+S>
ウインドウ間移動:<CTRL+W><CTRL+W>
				

ファイルの編集、カーソル位置へのファイルの挿入:


:e finame.txt
:r finame.txt
				

空白行(改行のみの行)を削除する:


:g/^$/d
				

先頭の空白(スペース、タブ)を削除する:


:%s/^\s\+//
				

連続するスペースをタブに置き換える:


:%s/ \+/\t/g
				

2行を1行に(偶数行を奇数行に)区切り文字,で連結する:


:g/^/ normal Jxi,
				

行番号を指定して起動する:


% vim +256 filename.txt
				

同じ文字(テキスト)を指定した回数分、繰り返し入力する:


32i-<ESC>
				

undoのやり直し:


<CTRL+R>
				

xxd

ファイルを16進ダンプする:


% xxd filename.bin
				

16進ダンプをバイナリーに変換する:


% echo e88c82 | xxd -r -p > mo.txt
				

テキストファイルからビットマップ画像を作成する

テキストファイルからビットマップ画像を作成する:


% vim sample.xpm

/* XPM */ static char *XPM_X[] = { /* columns rows colors chars-per-pixel */ ";32 8 5 1";, ";p c #c8bef7";, ";r c #f6bde6";, ";o c #f7e0b0";, ";g c #c7f7e5";, ";. c None";, /* pixels */ ";.pp...pp..rrrrr....ooooo.gggggg.";, ";.ppp.ppp.rr...rr..oo.......gg...";, ";.ppppppp.rr...rr.oo........gg...";, ";.ppppppp.rr...rr.oo..ooo...gg...";, ";.pp.p.pp.rr...rr.oo...oo...gg...";, ";.pp...pp.rr...rr..oo..oo...gg...";, ";.pp...pp..rrrrr....ooooo.gggggg.";, ";................................"; };
% convert sample.xpm sample.png

補足:

バッチファイル(DOS/Windows)

バッチファイルで実行したコマンドを画面に表示させない。通常はバッチファイルの先頭行に記載する。


@ECHO OFF
				

文字を表示する:


REM 文字を表示する
ECHO HELLO WORLD.

REM 空白行を表示する(ECHOの後にスペースを入れない) ECHO.

バッチファイルを終了する:


EXIT
				

何かキーが押されるまで待つ:


PAUSE
				

コメント行:


REM --------
REM  メイン
REM --------
				

変数の代入:


SET home=c:\home\user\mogi
SET bin="C:\Program Files\program\program.exe"
SET arg1=%1
				

文字入力:


SET ans=
SET /P ans="よろしいですか?(y/n)="
IF %ans%==y (
    ECHO 了解しました.
)
				

ファイルの中身を変数に代入する(最初の一行のみ):


SET /P url=<c:\home\user\mogi\websiteurl.txt
				

バッチファイル、アプリケーションなどを起動する:


REM c:\windowsフォルダーを開く
START c:\windows

REM .htmlファイルを開く START c:\home\user\mogi\index.html
REM .pdfファイルを開く START c:\home\user\mogi\file.pdf
REM .txtファイルを開く START c:\home\user\mogi\file.txt
REM URLを開く START https://moginwc.sakura.ne.jp
REM 変数に設定されたURLを開く SET url=https://moginwc.sakura.ne.jp START %url%

WSLのシェルスクリプトを実行:


REM シェルスクリプトを実行
WSL tcsh /home/user/mogi/program.tcsh

REM 引数付きでシェルスクリプトを実行する WSL tcsh /home/user/mogi/program.tcsh DCM800

クリップボード:


REM クリップボードへコピー
DIR | CLIP

REM クリップボードからペースト powershell -command "get-clipboard"

秀丸マクロ

現在の日付と時刻を挿入する(YYYY-MM-DD HH:MI形式)。


insert year + "-" + month + "-" + day + " " + hour + ":" + minute ;
endmacro;