2013年4月30日火曜日

awkのgetline活用例

awkを使用して統計データの集計を行う際、別の情報ソースと紐付けて処理を行いたい場合には、getlineを活用出来るケースがある。

例えば、1列目が生徒名、2列目が各生徒の点数から成る以下のようなデータ#1と、

Taro|90
Ziro|92
Saburo|84
Hanako|93
Kaoru|85
Yoko|91

1列目が生徒名、2列目が各生徒のクラス名から成る以下のような別のデータ#2が存在し、

Taro|A
Ziro|B
Saburo|A
Hanako|A
Kaoru|B
Yoko|B

これらのデータからクラス毎の平均点を算出したい場合、以下のスクリプトにより算出が可能となる。

~~~~~~~~
#!/bin/bash

# データ#1の読み込み
tensu=/home/tensu.txt

# データ#2の読み込み
classdb=/home/class.txt

awk 'BEGIN{
 FS="|"; Delimiter="|";
 cdb="'$classdb'";
  while ((getline < cdb) > 0) {
   member=1; class[$member]=$2;
  }
  close(cdb);
}{
 total[class[$1]]+=$2;
 count[class[$1]]++;
} END{
 for (r in count) {
  printf("%s%s%.2f\n", r, Delimiter, total[r]/count[r]);
 }
}' ${tensu}
~~~~~~~~

算出結果:
A|89.00
B|89.33

2013年4月27日土曜日

ファイルの有り/無しでごみ箱アイコンを自動更新


現在使用しているLubuntuデスクトップ環境にごみ箱アイコンを追加するついでに、ごみ箱内のファイル有り/無しでごみ箱アイコンを自動更新する処理と、アイコンのダブルクリックでごみ箱を空にする処理を追加。

作業ステップは以下の通り。

~~~~~~~~
ステップ1:
sudo apt-get install inotify-toolsを実行し、inotify-tools(inotifywait)をインストールする(ごみ箱内のファイルあるいは、フォルダの有無を常時監視するために必要)。

ステップ2:
以下の各スクリプトファイルを配置。また、配置後"chmod 755 ファイル名"にて権限を変更しておく。

trashdaemon: ごみ箱アイコンの自動更新処理のデーモン化用ファイル(なお、指定オプションはstartとstopのみ動作確認済)。/etc/init.d/配下に配置。
trashwatch.sh(注記): ごみ箱内のファイル有り/無しにより、アイコンを自動更新するためのスクリプトファイル。 /usr/sbin/配下に配置。
trashclear.sh: ごみ箱アイコンのダブルクリックでごみ箱を空にするためのスクリプトファイル。任意のフォルダに配置。

(注記) このスクリプトファイルの3行目にある"user=sample"は、"user=ログイン時のルートフォルダ名("/home/"以下のフォルダ名)"に置き換えが必要(複数アカウントには未対応)。

なお、ごみ箱アイコンの自動更新処理については、/etc/rc.localや/etc/init.d/rc.local内で対象スクリプトファイル(trashwatch.sh)の実行を指定したり、/etc/profile.d配下に対象スクリプトを配置したりして、ブートあるいは、ログイン時の自動実行を試みたが、上手く動作しなかったため、デーモン化を決定。
このスクリプトファイルがバックグラウンドで動作することに起因しているのかもしれない。

ステップ3:
デスクトップにごみ箱アイコンを作成。
テキストエディタを使用して下記内容を記述したファイルを作成し、Trash.desktopのファイル名でデスクトップに保存する。

[Desktop Entry]
Name=ごみ箱
Type=Application
Icon=emptytrash
Exec=/home/trash/trashclear.sh (左記は記述例。この行は、Exec="trashclear.shへのフルパス"の形式で記述)
Terminal=false

ステップ4:
コマンドラインにて"runlevel"を実行し、現在のrunlevelを確認する(例えば、“N 2"と出力される場合には、runlevelは2)。

ステップ5:
/etc/rc"x".d/ (ここで、"x"は現在のrunlevelで置き換え)配下に以下のシンボリックリンクを設定する。

sudo ln -s ../init.d/trashdaemon S80trashwatch

なお、"80"の部分については、任意の数値で良いと思われる。
~~~~~~~~

以上で完了。

sudo service trashdaemon start実行後あるいは、次回ブート時にごみ箱アイコンの自動更新処理が開始される。

2013年4月23日火曜日

マルチソートの方法

sortコマンドを使用してマルチソート(ソート結果を維持しながら複数列をソート)する場合には、-kオプションを使用する。

例えば以下のようなテーブルがあり、

b|3
c|1
b|1
c|3
a|2
a|3

1列目をアルファベットの逆順でソート後、その順序(アルファベットの逆順)を維持したまま2列目を昇順でソートしたい場合、sort -t "|" -k1,1r -k2,2nrを実行すると、以下の通りに所望の結果が得られる。

c|3
c|1
b|3
b|1
a|3
a|2

ここで、各オプションの意味は以下の通りであり、"-k1,1r"にて一列目を逆順でソートし、"-k2,2nr"にて二列目を昇順でソートしている。

(1) -tオプションはテーブルの区切り("|")を指定
(2) nは対象列を数値とみなしてソート
(3) rは逆順(数値列の場合は昇順)でソート

なお、マルチソート対象の列数が3列以上となっている場合でも、sort -t "|" -k1,1r -k2,2nr -k3,3のように、順次"-k"オプションを追加設定することで対応可能。

例えば10列の数値テーブルにおいて、7列目、4列目及び、2列目のみをソート対象とし、なおかつこの順序で降順でマルチソートしたい場合には、sort -t "|" -k7,7n -k4,4n -k2,2nとすれば良い。

dpkg-reconfigure tzdataによるタイムゾーン変更

Ubuntuにおけるタイムゾーン変更は、dpkg-reconfigure tzdataの実行により可能。
実行後、地域(例:Asia)→都市(例:Tokyo)の順に選択して完了。

Ubuntuのメモリ・キャッシュのクリア方法

以下の手法により、Ubuntuマシンのメモリ・キャッシュをクリア出来る。

[1] ページキャッシュの解放: echo 1 > /proc/sys/vm/drop_caches
[2] dentry及び、inodeの解放: echo 2 > /proc/sys/vm/drop_caches
[3] ページキャッシュ、dentry及び、inodeの解放: echo 3 > /proc/sys/vm/drop_caches

上記[3]を実行した場合のキャッシュ使用量の変化は以下の通り。

========
実行前:
top - 02:24:38 up 8:21, 3 users, load average: 0.21, 0.34, 0.31
Tasks: 178 total, 2 running, 174 sleeping, 0 stopped, 2 zombie
Cpu(s): 3.9%us, 1.6%sy, 0.0%ni, 94.3%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8062188k total, 1620540k used, 6441648k free, 87868k buffers
Swap: 9764860k total, 0k used, 9764860k free, 789588k cached

実行後:
top - 02:25:02 up 8:22, 3 users, load average: 0.27, 0.34, 0.31
Tasks: 180 total, 1 running, 177 sleeping, 0 stopped, 2 zombie
Cpu(s): 3.9%us, 1.6%sy, 0.0%ni, 94.3%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8062188k total, 970288k used, 7091900k free, 2244k buffers
Swap: 9764860k total, 0k used, 9764860k free, 237996k cached
========

約550MB程度が解放された。

UbuntuへのSSH接続が遅い場合の対処方法

[1] /etc/ssh/sshd_configに"UseDNS no"の記述を追加
[2] sudo /etc/init.d/ssh restartを実行

オフラインのUbuntuマシンにアプリケーションを導入する方法

オフラインのUbuntuマシンにアプリケーションを導入する方法は以下の通り。

オンラインのUbuntuマシンで以下を実行:
[1] sudo apt-get cleanを実行し、/var/cache/apt/archivesに保存されている古いパッケージを消去
[2] 所望のアプリケーションをsudo apt-get installでインストール
[3] var/cache/apt/archivesに保存された対象パッケージをUSBメモリなどの別メディアにコピー

パッケージの導入対象Ubuntuマシンで以下を実行:
[1] 上記[3]のパッケージを任意のフォルダに配置
[2] sudo dpkg -i *.debにて対象パッケージをインストール(ただし、インストールされる順番次第で依存関係によるエラーが出る場合があるので、その場合には、対象パッケージを個別にインストールしていく)

UbuntuにTeamViewer8導入でクラッシュ…

Ubuntu 12.04 LTSにTeamViewer8をインストールしたところ、lsb_releaseのクラッシュが多発するようになった。

https://bugs.launchpad.net/ubuntu/+source/lsb/+bug/1094218

に対策が書かれており、/opt/teamviewer8/tv_bin/script/tvw_mainのfunction LogStartupInfo()内の記述を以下の通りに変更したところ、クラッシュは発生しなくなった。

変更前:
if [ -x "$(type -p lsb_release)" ] ; then # log information about the Linux distribution
lsb_release -a
make_path "$WINEPREFIX/drive_c"
lsb_release -ds > "$WINEPREFIX/drive_c/distrelease"
else

変更後:
if [ -x "$(type -p lsb_release)" ] ; then # log information about the Linux distribution
#lsb_release -a
make_path "$WINEPREFIX/drive_c"
cat /etc/lsb-release | grep DESCRIPTION | cut -f2 -d= | sed 's/"//g' > $WINEPREFIX/drive_c/distrelease"
else

Ubuntuでawkが遅い!

Ubuntu 12.04 LTSでawk(mawk)の処理速度が異様に遅く(メモリ使用率の上昇速度が明らかに遅い...)、locale設定もいろいろと変更してみたものの改善せず...

gawkを試してみるべく、apt-get install gawkで導入すると期待値通りの処理速度に。

その後、再度mawkで処理させると、こちらも期待値通りの処理速度になっていることを確認。

gawk導入と処理速度向上との相関については、時間がある時にでも調べてみたい。