プログラミングメモ
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
補足:
- あらかじめImageMagickをインストールしておくこと。
- OS環境によっては、convertではなくmagickコマンドの場合がある。
- GraphicConverterでも変換可能。
バッチファイル(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;