Zonuの雑記帳。1週間に1回更新が目標です。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
最近メモ書きになってる,との指摘を受けてますが,気にせずに書きます.
シェルスクリプトで,ファイルからの読み込みを用いて,一気にデータを抽出する方法です.
awkなんかを使うと簡単にできるのかもしれませんが,awkを勉強してないのでこの方法でやってます.
今回は,ITproの記事を参考にして,こんな感じの捨てスクリプトを書きました.
cutup.sh
--
01: echo "CUT UP DATAS"
02: echo "READING file list from $1"
03:
04: BUFIFS=$IFS
05: IFS=
06:
07: exec 3< $1
08: while read FL 0<&3
09: do
10: echo $FL
11: grep '^ *2.00' $FL | sed "s/^ *2.00//" > 2.0_$FL
12: done
13: exec 3<&-
14:
15: IFS=$BUFIFS
--
スクリプトの解説です.
4行目に出てくるIFS,これはシェルスクリプトの予約変数です.
Internal Field Separaterの略で,シェルがコマンドラインを走査するときの区切り文字を定義します.
4行目では,シェルが標準で定義しているIFSをBUFIFSに保存しています.
15行目でBUFIFSをIFSに書き戻すことによって,後で実行されるスクリプトに影響がないようにしているわけです.
5行目ではIFSをNULLにしていると思われます.
これは,あとで$1に渡されたファイルの中身を読むときに,空白文字などを区切り文字として読んでもらっては困るからです.
Windowsだと良くありますよね,ファイル名に空白が入ってるものとか.
7行目.
ファイルディスクリプタに$1で指定されたファイルを渡します.
これが3なのは,0(stdin), 1(stdout), 2(stderr) は既にシェルで使用されているためのようです.
8行目.
ファイルディスクリプタに渡されたファイルから1行読み変数FLに格納します.
また,while文になっているので9~12行目を繰り返し実行,つまりファイルから読めなくなるまで繰り返します.
13行目.
7行目でオープンしたファイルディスクリプタ3を閉じます.
do~doneの中に入っている処理を変更すると,いろいろな処理が自動で実行できるようになります.
また,このプログラムに渡すファイル一覧は,
--
$ ls > dirs.txt
--
などを利用して取得することが可能です.
PR
シェルスクリプトで,ファイルからの読み込みを用いて,一気にデータを抽出する方法です.
awkなんかを使うと簡単にできるのかもしれませんが,awkを勉強してないのでこの方法でやってます.
今回は,ITproの記事を参考にして,こんな感じの捨てスクリプトを書きました.
cutup.sh
--
01: echo "CUT UP DATAS"
02: echo "READING file list from $1"
03:
04: BUFIFS=$IFS
05: IFS=
06:
07: exec 3< $1
08: while read FL 0<&3
09: do
10: echo $FL
11: grep '^ *2.00' $FL | sed "s/^ *2.00//" > 2.0_$FL
12: done
13: exec 3<&-
14:
15: IFS=$BUFIFS
--
スクリプトの解説です.
4行目に出てくるIFS,これはシェルスクリプトの予約変数です.
Internal Field Separaterの略で,シェルがコマンドラインを走査するときの区切り文字を定義します.
4行目では,シェルが標準で定義しているIFSをBUFIFSに保存しています.
15行目でBUFIFSをIFSに書き戻すことによって,後で実行されるスクリプトに影響がないようにしているわけです.
5行目ではIFSをNULLにしていると思われます.
これは,あとで$1に渡されたファイルの中身を読むときに,空白文字などを区切り文字として読んでもらっては困るからです.
Windowsだと良くありますよね,ファイル名に空白が入ってるものとか.
7行目.
ファイルディスクリプタに$1で指定されたファイルを渡します.
これが3なのは,0(stdin), 1(stdout), 2(stderr) は既にシェルで使用されているためのようです.
8行目.
ファイルディスクリプタに渡されたファイルから1行読み変数FLに格納します.
また,while文になっているので9~12行目を繰り返し実行,つまりファイルから読めなくなるまで繰り返します.
13行目.
7行目でオープンしたファイルディスクリプタ3を閉じます.
do~doneの中に入っている処理を変更すると,いろいろな処理が自動で実行できるようになります.
また,このプログラムに渡すファイル一覧は,
--
$ ls > dirs.txt
--
などを利用して取得することが可能です.
ネタが無いので適当に書きます.
データファイルから特定の値を抜き出したいときに,grepと sedが便利です.
GNU SOFTWAREなので,UNIX/Linuxには標準で,Windowsの人はCygwinを入れれば使えます.
作業のイメージは,上のような3次元グラフの,ある断面をカットしたような2次元グラフを作成する,というようなものです.


今回は,下のようなデータファイル(X座標,Y座標,温度)からX=2.00の部分だけを抜き出しました.
---
0.00 0.00 100.00
0.10 0.00 20.00
0.20 0.00 20.00
0.30 0.00 20.00
0.40 0.00 20.00
0.50 0.00 20.00
0.60 0.00 20.00
0.70 0.00 20.00
0.80 0.00 20.00
0.90 0.00 20.00
1.00 0.00 20.00
1.10 0.00 20.00
10.00 0.00 20.00
0.00 1000.00 100.00
0.10 1000.00 71.51
0.20 1000.00 48.35
0.30 1000.00 33.08
0.40 1000.00 24.94
0.50 1000.00 21.52
0.60 1000.00 20.39
0.70 1000.00 20.08
0.80 1000.00 20.02
0.90 1000.00 20.00
1.00 1000.00 20.00
1.10 1000.00 20.00
10.00 1000.00 20.00
・・・以下Y=10,000まで1,000刻みで続く
----
まずgrepの正規表現検索を使用して,X=2.00の列を抜き出します.
$ grep '^ *2.00' filename
^は行頭を,*は一つ前の文字セットを繰り返す正規表現なので,これは,
行頭からスペースが続いた後に,2.00が記述されている列を意味しています.
次に,こうして出力されたX=2.00の列から,gnuplotのplot命令で2次元グラフが書けるように,X座標の列を消去します.
$ sed 's/^ *2.00//'
sedの 's/regA/regB/'は正規表現文字列regAをregBに変換します.
以上の二つをパイプでつなげ,適当なファイルにリダイレクトして完了!
$ grep '^ *2.00' foo.dat | sed 's/^ *2.00//' > hoge.dat
リダイレクトのときの注意点は,絶対に入力ファイルに書き込まないことです.
まあ,データファイルが1個程度なら手動でもいいんですが,100個とか1000個とかあると,手動では無理なので,シェルスクリプトと上のコマンドを組み合わせて自動的に抽出していきます.
データファイルから特定の値を抜き出したいときに,grepと sedが便利です.
GNU SOFTWAREなので,UNIX/Linuxには標準で,Windowsの人はCygwinを入れれば使えます.
作業のイメージは,上のような3次元グラフの,ある断面をカットしたような2次元グラフを作成する,というようなものです.
今回は,下のようなデータファイル(X座標,Y座標,温度)からX=2.00の部分だけを抜き出しました.
---
0.00 0.00 100.00
0.10 0.00 20.00
0.20 0.00 20.00
0.30 0.00 20.00
0.40 0.00 20.00
0.50 0.00 20.00
0.60 0.00 20.00
0.70 0.00 20.00
0.80 0.00 20.00
0.90 0.00 20.00
1.00 0.00 20.00
1.10 0.00 20.00
10.00 0.00 20.00
0.00 1000.00 100.00
0.10 1000.00 71.51
0.20 1000.00 48.35
0.30 1000.00 33.08
0.40 1000.00 24.94
0.50 1000.00 21.52
0.60 1000.00 20.39
0.70 1000.00 20.08
0.80 1000.00 20.02
0.90 1000.00 20.00
1.00 1000.00 20.00
1.10 1000.00 20.00
10.00 1000.00 20.00
・・・以下Y=10,000まで1,000刻みで続く
----
まずgrepの正規表現検索を使用して,X=2.00の列を抜き出します.
$ grep '^ *2.00' filename
^は行頭を,*は一つ前の文字セットを繰り返す正規表現なので,これは,
行頭からスペースが続いた後に,2.00が記述されている列を意味しています.
次に,こうして出力されたX=2.00の列から,gnuplotのplot命令で2次元グラフが書けるように,X座標の列を消去します.
$ sed 's/^ *2.00//'
sedの 's/regA/regB/'は正規表現文字列regAをregBに変換します.
以上の二つをパイプでつなげ,適当なファイルにリダイレクトして完了!
$ grep '^ *2.00' foo.dat | sed 's/^ *2.00//' > hoge.dat
リダイレクトのときの注意点は,絶対に入力ファイルに書き込まないことです.
まあ,データファイルが1個程度なら手動でもいいんですが,100個とか1000個とかあると,手動では無理なので,シェルスクリプトと上のコマンドを組み合わせて自動的に抽出していきます.
Linux版のgoogle picasa(写真管理ツール)があるようです.
ってか,プレスリリースが去年ですが・・・.
米Google,デジタル写真編集ソフト「Picasa」Linux版をリリース
Wineを使わないといけない,ということらしいので,
帰ったらWineの設定をしてみようかなぁ.
Gnome付属のF-Spotも悪くないけれど,イマイチな感じが拭えない.
既存の画像のインポートがうまくできないようだし・・・.
KDEのdigiKamのほうが使い易かったです.
デスクトップ設定関連はGnomeのほうがラクチンですが,付属のツールはKDEのほうが{見栄えがいい|使いやすい}ような気がします.
ってか,プレスリリースが去年ですが・・・.
米Google,デジタル写真編集ソフト「Picasa」Linux版をリリース
Wineを使わないといけない,ということらしいので,
帰ったらWineの設定をしてみようかなぁ.
Gnome付属のF-Spotも悪くないけれど,イマイチな感じが拭えない.
既存の画像のインポートがうまくできないようだし・・・.
KDEのdigiKamのほうが使い易かったです.
デスクトップ設定関連はGnomeのほうがラクチンですが,付属のツールはKDEのほうが{見栄えがいい|使いやすい}ような気がします.
ドライバがfxxkなATiのRADEONから(Linux上でのハナシです),nVIDIAにボードを載せ替えたので,Ubuntuでデュアルディスプレイ化してみました.
各スクリーンは以下のとおり.
Screen0: LG L1950H DFP (1280x1024)
Screen1: SONY KV-21DA55 TV (1024x768)
デュアル化自体はnvidia-settingsで簡単に可能です.
かつ,
1.パネルはScreen0だけに表示
2. Screen0とScreen1を接続する
ためには,xineramaオプションをONにしなければなりません.
が,xineramaをONにすると,gnome-terminalが起動しなくなります.
ちょっとエラーメッセージを保存し忘れたのですが・・・.
どうやら,「Screenが2つ(0と1)あるはずなのに,1個しかないぞ!」的なエラーを吐いている模様.
いろいろ探した結果,Fedora Supportのログの通りにすると解決できました.
一番下に解決方法があるのですが,その前のmwetteさん曰く
>"This is a known X server bug which is triggered when using Composite with Xinerama. You should report it to Ubuntu. The current workaround is to disable Composite or Xinerama."
XineramaではCompositeをOFFにしろ,ということらしいです.
xorg.confに以下を追加します.
===============================
Section "Extensions"
Option "Composite" "false"
EndSection
===============================
そもそも,Composite Extensionってなんだって話なんですが,
freedesktop.orgによれば,
>This extension causes a entire sub-tree of the window hierarchy to be rendered to an off-screen buffer. Applications can then take the contents of that buffer and do whatever they like. The off-screen buffer can be automatically merged into the parent window or merged by external programs, called compositing managers. Compositing managers enable lots of fun effects.
だ,そうで.
Off-screen bufferに描画したものをComposite managerで親windowに合成できるとかなんとか.
早い話が,lots of fun effectsにあるように,「透過ウィンドウとかもできるよ!」って話のようです.
現時点では使用していないので,OFFでも問題なし.
各スクリーンは以下のとおり.
Screen0: LG L1950H DFP (1280x1024)
Screen1: SONY KV-21DA55 TV (1024x768)
デュアル化自体はnvidia-settingsで簡単に可能です.
かつ,
1.パネルはScreen0だけに表示
2. Screen0とScreen1を接続する
ためには,xineramaオプションをONにしなければなりません.
が,xineramaをONにすると,gnome-terminalが起動しなくなります.
ちょっとエラーメッセージを保存し忘れたのですが・・・.
どうやら,「Screenが2つ(0と1)あるはずなのに,1個しかないぞ!」的なエラーを吐いている模様.
いろいろ探した結果,Fedora Supportのログの通りにすると解決できました.
一番下に解決方法があるのですが,その前のmwetteさん曰く
>"This is a known X server bug which is triggered when using Composite with Xinerama. You should report it to Ubuntu. The current workaround is to disable Composite or Xinerama."
XineramaではCompositeをOFFにしろ,ということらしいです.
xorg.confに以下を追加します.
===============================
Section "Extensions"
Option "Composite" "false"
EndSection
===============================
そもそも,Composite Extensionってなんだって話なんですが,
freedesktop.orgによれば,
>This extension causes a entire sub-tree of the window hierarchy to be rendered to an off-screen buffer. Applications can then take the contents of that buffer and do whatever they like. The off-screen buffer can be automatically merged into the parent window or merged by external programs, called compositing managers. Compositing managers enable lots of fun effects.
だ,そうで.
Off-screen bufferに描画したものをComposite managerで親windowに合成できるとかなんとか.
早い話が,lots of fun effectsにあるように,「透過ウィンドウとかもできるよ!」って話のようです.
現時点では使用していないので,OFFでも問題なし.
※この記事はスタブです
スペックシート:www.orpheuscomputing.com/downloads/Aopen_nCK804Ua-LFS_specs-info.pdf
上のスペックシートによると、Aopen nCK804Ua-LFSのSuper I/OはWinbond 83627THFらしい。
lm-sensorsをインストールして、sensors-detectをかけるとSuper I/Oが検出され、電圧のモニタができるがファンの回転数が取れない。
この問題はlists.lm-sensors.org/pipermail/lm-sensors/2005-May/012324.htmlを参考にすると解決できるかもしれない。
追記:
どうもnCK804Ua-LFSのファン回転数はFintekのチップが行っているらしい。
lm-sensorsのForumには「今のところサポートする予定なし」とのことで・・・。
残念。lm-sensorsのソースでも覗いてみますか・・・。
スペックシート:www.orpheuscomputing.com/downloads/Aopen_nCK804Ua-LFS_specs-info.pdf
上のスペックシートによると、Aopen nCK804Ua-LFSのSuper I/OはWinbond 83627THFらしい。
lm-sensorsをインストールして、sensors-detectをかけるとSuper I/Oが検出され、電圧のモニタができるがファンの回転数が取れない。
この問題はlists.lm-sensors.org/pipermail/lm-sensors/2005-May/012324.htmlを参考にすると解決できるかもしれない。
追記:
どうもnCK804Ua-LFSのファン回転数はFintekのチップが行っているらしい。
lm-sensorsのForumには「今のところサポートする予定なし」とのことで・・・。
残念。lm-sensorsのソースでも覗いてみますか・・・。
カレンダー
05 | 2025/06 | 07 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Internal Search
Category
About
name: Zonu
mail: pico@any.xii.jp
mail: pico@any.xii.jp
某地方国立大学院生。 歯車とか電子回路とかを見るとワクワクする、いわゆるメカフェチ。( not ロボオタ )
情報系学科だったはずなのに、気づけば環境系学科に。 お蔭様で、就職活動の際は説明が大変でした。 (でもその話題をツカミにできたので結果オーライかも)解析メインの研究なので、 FortranとかC++とかをメインにPythonとかOpenGLとかも使ってます。