腐っても鯛? 騏も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語AWKについて語るスレ
◆ 前スレ
awkについて語るスレ
http://pc10.2ch.net/test/read.cgi/tech/1023556171/
◆ 関係スレ
シェルスクリプト相談室
http://pc10.2ch.net/test/read.cgi/tech/1112553783/
AWKでCGI
http://pc10.2ch.net/test/read.cgi/php/1171804314/
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc10.2ch.net/test/read.cgi/linux/1154578200/
◆ 参考
The AWK Programming Language (Brian Kernighan):
ttp://cm.bell-labs.com/cm/cs/awkbook/index.html
GAWK (GNU Projedt):
ttp://www.gnu.org/software/gawk/
探検
awkについて語るスレ $2
■ このスレッドは過去ログ倉庫に格納されています
2007/02/23(金) 23:55:42
795デフォルトの名無しさん
2016/09/14(水) 00:22:19.58ID:YCeX8Gov 同じじゃないぞ。数値と文字列だ。
ところで、君が使ってる awk はどれ?
apropos awk
ってやってみたら、こんなん出てきた。
gawk (1) - パターン検索・処理言語
igawk (1) - インクルードファイルを使う gawk
a2p (1) - Awk to Perl translator
awk (1) - pattern scanning and text processing language
English (3perl) - use nice English (or awk) names for ugly punctuation v...
mawk (1) - pattern scanning and text processing language
nawk (1) - pattern scanning and text processing language
ところで、君が使ってる awk はどれ?
apropos awk
ってやってみたら、こんなん出てきた。
gawk (1) - パターン検索・処理言語
igawk (1) - インクルードファイルを使う gawk
a2p (1) - Awk to Perl translator
awk (1) - pattern scanning and text processing language
English (3perl) - use nice English (or awk) names for ugly punctuation v...
mawk (1) - pattern scanning and text processing language
nawk (1) - pattern scanning and text processing language
796デフォルトの名無しさん
2016/09/14(水) 22:01:59.31ID:DqYC5LBT >>795
例が悪くてスマソ、Cygwin上でgawk4.1.4使って
for(i=1;i<=1000000;i++){a[i]="1"}
と
for(i=1;i<=1000000;i++){a[i]=sprintf("1")}
でループ脱出直後のメモリ使用量を比較すると
上が60MBytes、下が600MBytesとかになった
cmdで動くgawkの3.1.7でも同じような差がでた
Linuxは試していないけど、もし大丈夫ならWindows版の問題かも
例が悪くてスマソ、Cygwin上でgawk4.1.4使って
for(i=1;i<=1000000;i++){a[i]="1"}
と
for(i=1;i<=1000000;i++){a[i]=sprintf("1")}
でループ脱出直後のメモリ使用量を比較すると
上が60MBytes、下が600MBytesとかになった
cmdで動くgawkの3.1.7でも同じような差がでた
Linuxは試していないけど、もし大丈夫ならWindows版の問題かも
797デフォルトの名無しさん
2016/09/14(水) 22:50:10.30ID:PWB0Awgu798795
2016/09/14(水) 23:40:38.22ID:YCeX8Gov やってみたよ。環境は Debian jessie。
テストプログラム
#!/usr/bin/perl -w
use strict;
{
my $do_ps = 'system("ps p $PPID o pid,sz,args")';
foreach ( 1,'sprintf("1")'){
system('gawk',"BEGIN { for(i=1;i<=1000000;i++){a[i]=$_} $do_ps;}");
}
}
実行結果
PID SZ COMMAND
7389 7693 gawk BEGIN { for(i=1;i<=1000000;i++){a[i]=1} system("ps p $PPID o pid,sz,args");}
PID SZ COMMAND
7392 158116 gawk BEGIN { for(i=1;i<=1000000;i++){a[i]=sprintf("1")} system("ps p $PPID o pid,sz,args");}
KB 単位らしいから 8MB と 160MB 。ただごとじゃない差だね。
1 を "1" に変更してもこんな感じだから数値と文字列の差というわけではなさそう。
テストプログラム
#!/usr/bin/perl -w
use strict;
{
my $do_ps = 'system("ps p $PPID o pid,sz,args")';
foreach ( 1,'sprintf("1")'){
system('gawk',"BEGIN { for(i=1;i<=1000000;i++){a[i]=$_} $do_ps;}");
}
}
実行結果
PID SZ COMMAND
7389 7693 gawk BEGIN { for(i=1;i<=1000000;i++){a[i]=1} system("ps p $PPID o pid,sz,args");}
PID SZ COMMAND
7392 158116 gawk BEGIN { for(i=1;i<=1000000;i++){a[i]=sprintf("1")} system("ps p $PPID o pid,sz,args");}
KB 単位らしいから 8MB と 160MB 。ただごとじゃない差だね。
1 を "1" に変更してもこんな感じだから数値と文字列の差というわけではなさそう。
799デフォルトの名無しさん
2016/09/14(水) 23:49:14.48ID:YCeX8Gov ごめん、書き忘れた。
GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p3, GNU MP 6.0.0)
Copyright (C) 1989, 1991-2014 Free Software Foundation.
GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p3, GNU MP 6.0.0)
Copyright (C) 1989, 1991-2014 Free Software Foundation.
800デフォルトの名無しさん
2016/09/17(土) 08:30:37.61ID:didBD5ba よく考えたら、メモリの使用量自体じゃなくて、それがどれだけ増えたかが重要だね。
そして、連想配列の構造体とキーに必要な量はどのケースでも同じと考えられる。
つまり、連想配列の要素のための量がどれだけ違うかを直接知ることができるはず。
というわけで、もう一回テスト。
https://ideone.com/mRuFj7
そして、連想配列の構造体とキーに必要な量はどのケースでも同じと考えられる。
つまり、連想配列の要素のための量がどれだけ違うかを直接知ることができるはず。
というわけで、もう一回テスト。
https://ideone.com/mRuFj7
801デフォルトの名無しさん
2016/09/17(土) 08:32:42.20ID:didBD5ba 実行結果
element before after diff
1 5685 7691 2006
i 5685 29226 23541
sprintf("%d",i) 5685 158124 152439
sprintf("%d",i) + 0 5685 29221 23536
sprintf("%d",i) "" 5685 37026 31341
1000000 要素の配列で 2MB って、いったいどうやってるんだろう。少なすぎる。
sprintf("%d",i) が突出して多いのは sprintf で多めに確保して
切り詰めたりせずにそのまま使ってるのだろうか。
さあ、gawk のソースコードをハックしてみるか!
element before after diff
1 5685 7691 2006
i 5685 29226 23541
sprintf("%d",i) 5685 158124 152439
sprintf("%d",i) + 0 5685 29221 23536
sprintf("%d",i) "" 5685 37026 31341
1000000 要素の配列で 2MB って、いったいどうやってるんだろう。少なすぎる。
sprintf("%d",i) が突出して多いのは sprintf で多めに確保して
切り詰めたりせずにそのまま使ってるのだろうか。
さあ、gawk のソースコードをハックしてみるか!
802デフォルトの名無しさん
2016/09/17(土) 14:11:27.89ID:IIH0ZjSk 推測だけど、stream, yield, callback、遅延処理かも
データをバッファサイズ分だけ読み込んで処理して、
次のコマンドへ送ったら、それを捨てて、次のデータを読み込むのかも
この方式だとメモリは、バッファサイズ分だけしか使わない
データをバッファサイズ分だけ読み込んで処理して、
次のコマンドへ送ったら、それを捨てて、次のデータを読み込むのかも
この方式だとメモリは、バッファサイズ分だけしか使わない
803デフォルトの名無しさん
2016/09/18(日) 10:41:36.96ID:6jI6cHER ベクターに公開されてるgawk3.1.5(と非公開の3.1.7)、ヘンテコな処理が見つかったのでメモ
このgawkのsystem関数を実行すると、環境変数TMPが指してるフォルダに
@echo off
system関数の引数
という2行が書かれたバッチファイルpip?.bat(?はsystem実行回数+1)というのが作成され
このgawkのsystem関数を実行すると、環境変数TMPが指してるフォルダに
@echo off
system関数の引数
という2行が書かれたバッチファイルpip?.bat(?はsystem実行回数+1)というのが作成され
804デフォルトの名無しさん
2016/09/18(日) 10:44:42.56ID:6jI6cHER ・・・いっぺんに書こうとしたらハネられるorz
805803
2016/09/18(日) 10:46:32.08ID:6jI6cHER (続き)
それを/c pip?.batで起動、完了後にpip?.batを
削除という流れでコマンドが実行される
それを/c pip?.batで起動、完了後にpip?.batを
削除という流れでコマンドが実行される
806803
2016/09/18(日) 10:47:07.98ID:6jI6cHER (続き)
system関数を使ったスクリプトを同時に1つしか実行しないなら良いけど
2つ以上実行したときはタイミング次第でpip?.batの数字がぶつかり、先に実行した側が
・ コマンドが実行されない
・ コマンドが実行されるけど、完了後に「バッチファイルが見つかりません」が吐かれる
という結果になる
予めcmdの窓ごとにTMPを変えておけば問題ないけど面倒くさい
コマンド | getlineで起動したほうが手っ取り早いと思う
(ただし出力が2KBytes溜まると止まるから適宜リダイレクトする)
でも何でこんな方法でsystem関数を実装したんだろうね(´・ω・`)
system関数を使ったスクリプトを同時に1つしか実行しないなら良いけど
2つ以上実行したときはタイミング次第でpip?.batの数字がぶつかり、先に実行した側が
・ コマンドが実行されない
・ コマンドが実行されるけど、完了後に「バッチファイルが見つかりません」が吐かれる
という結果になる
予めcmdの窓ごとにTMPを変えておけば問題ないけど面倒くさい
コマンド | getlineで起動したほうが手っ取り早いと思う
(ただし出力が2KBytes溜まると止まるから適宜リダイレクトする)
でも何でこんな方法でsystem関数を実装したんだろうね(´・ω・`)
807デフォルトの名無しさん
2016/09/18(日) 13:53:41.51ID:EIh/dcA1 tmpfile を使えば、他と重複しない、ランダムな名前のファイルを作れるのに、
どうして使わないのだろう?
どうして使わないのだろう?
808デフォルトの名無しさん
2016/09/18(日) 14:54:02.97ID:KtcAr9oX MS-DOS ではね、コマンドラインの長さの制限が厳しかったんだよ。驚くなかれ、たった 128 バイトだ。
そんな環境では、バッチファイルにすれば実行できるけど
command /c "prog arg1 arg2 ..."
では command /c のせいで制限を越えるということもあるだろう。つまり、そういうことだ。
………冗談だ。確かにそういう制限はあったけど。
現在はもう system 関数ではそういうことをしていないということが ChangeLog に書かれてるよ。
2014-01-15 Eli Zaretskii <eliz@gnu.org>
* popen.c (os_system): Use spawnl, and quote the command line, to be consistent with what gawk_popen does.
(os_popen) [__MINGW32__]: Don't scriptify the command, to be consistent with gawk_popen.
(os_pclose) [__MINGW32__]: Update to match os_open: no need to unlink the script file.
そんな環境では、バッチファイルにすれば実行できるけど
command /c "prog arg1 arg2 ..."
では command /c のせいで制限を越えるということもあるだろう。つまり、そういうことだ。
………冗談だ。確かにそういう制限はあったけど。
現在はもう system 関数ではそういうことをしていないということが ChangeLog に書かれてるよ。
2014-01-15 Eli Zaretskii <eliz@gnu.org>
* popen.c (os_system): Use spawnl, and quote the command line, to be consistent with what gawk_popen does.
(os_popen) [__MINGW32__]: Don't scriptify the command, to be consistent with gawk_popen.
(os_pclose) [__MINGW32__]: Update to match os_open: no need to unlink the script file.
809デフォルトの名無しさん
2016/09/18(日) 15:07:54.47ID:KtcAr9oX でもソースコードを見るかぎり、パイプではそういうことをしてるみたいなんだけど……
ちょっと試してみてくれないかな。
system("dir") | getline
みたいな感じ? よく知らないけど。
ちょっと試してみてくれないかな。
system("dir") | getline
みたいな感じ? よく知らないけど。
810803
2016/09/18(日) 16:19:12.82ID:6jI6cHER コマンド | getline で起動する場合はpip?.batは作られませんでした
system関数だけpip?.bat経由の模様
klabaster版のwindows用gawk4.1.3だとsystem関数がpip?.batを
作らなかったから、ベクター版固有の動きかなあと思います
system関数だけpip?.bat経由の模様
klabaster版のwindows用gawk4.1.3だとsystem関数がpip?.batを
作らなかったから、ベクター版固有の動きかなあと思います
811デフォルトの名無しさん
2016/09/18(日) 17:46:00.36ID:KtcAr9oX ありがとうございます。
gawk-4.1.1 の pc/popen.c を見た限りでは gawk の system 関数でバッチファイルを作るのは MINGW 限定で、
ChangeLog には問題が解消されたから直接 spawnl で実行するようにしたと書かれているわけですが
gawk のパイプ処理を実行している(と思われる) os_popen 関数ではバッチファイルを作るときと同様に
tempnam 関数でファイル名を作った上で、そのファイルを経由して受け渡しをしているように見えます。
これは MS-DOS の時代から使われてるやり方で、パイプのように見えてもパイプではありません。
このやり方だと gawk で
while (( command | getline) > 0)
と書いても実質的には
system("command > filename"); while (( getline < "filename") > 0)
と同じことになります。
あくまでも 4.1.1 の pc/popen.c の os_popen 関数がそう見えるというだけで、実際には違うかもしれませんが
自分で試すことができません。そもそも 3.1.5 のソースコードってどこにあるの?
もし勘違いじゃないなら >>806 と同じ問題が起こりそうな気が……
Linux を使ってる自分には関係ないといってしまえばそれまでですが。
gawk-4.1.1 の pc/popen.c を見た限りでは gawk の system 関数でバッチファイルを作るのは MINGW 限定で、
ChangeLog には問題が解消されたから直接 spawnl で実行するようにしたと書かれているわけですが
gawk のパイプ処理を実行している(と思われる) os_popen 関数ではバッチファイルを作るときと同様に
tempnam 関数でファイル名を作った上で、そのファイルを経由して受け渡しをしているように見えます。
これは MS-DOS の時代から使われてるやり方で、パイプのように見えてもパイプではありません。
このやり方だと gawk で
while (( command | getline) > 0)
と書いても実質的には
system("command > filename"); while (( getline < "filename") > 0)
と同じことになります。
あくまでも 4.1.1 の pc/popen.c の os_popen 関数がそう見えるというだけで、実際には違うかもしれませんが
自分で試すことができません。そもそも 3.1.5 のソースコードってどこにあるの?
もし勘違いじゃないなら >>806 と同じ問題が起こりそうな気が……
Linux を使ってる自分には関係ないといってしまえばそれまでですが。
812デフォルトの名無しさん
2016/09/18(日) 19:56:17.75ID:zTPoEkjL >>811
vectorの配布ファイル内のreadmeにはソースコードの
公開場所を探してるとか、直接連絡すれば渡すとか書いてある。
Windows版、NTあたりから一時ファイル作らずにパイプ動作するように
なったとか、どこかで読んだ気がするけど。
vectorの配布ファイル内のreadmeにはソースコードの
公開場所を探してるとか、直接連絡すれば渡すとか書いてある。
Windows版、NTあたりから一時ファイル作らずにパイプ動作するように
なったとか、どこかで読んだ気がするけど。
813デフォルトの名無しさん
2016/09/18(日) 22:03:20.37ID:KtcAr9oX 謎は解けた。
ファイルを使ってデータを渡すのはマクロ __DJGPP__ とマクロ __MINGW32__ が
いずれも定義されていない場合らしいです。
Vector のは MINGW なので該当しません。お騒がせしました。
ファイルを使ってデータを渡すのはマクロ __DJGPP__ とマクロ __MINGW32__ が
いずれも定義されていない場合らしいです。
Vector のは MINGW なので該当しません。お騒がせしました。
814デフォルトの名無しさん
2016/09/19(月) 11:56:06.00ID:iIvzjj/t ファイルを経由していても、ストレージに書き込むとは限らない
メモリ上だけに存在する、ファイルもあり得る。
LinuxのRAMディスク、tmpfs とか
メモリ上だけに存在する、ファイルもあり得る。
LinuxのRAMディスク、tmpfs とか
815803
2016/09/19(月) 14:26:19.66ID:fDWhtT6v816デフォルトの名無しさん
2016/09/20(火) 17:00:26.41ID:RIxgZ1yj 先日アクセスできなかった GNU のサイトが復活してたので 3.1.5 のソースコードを入手できました。
やっぱり os_popen からも scriptify を呼んでたみたいですね。4.1.1 のソースコードじゃ判りませんでした。
一応 chdir はアトミックな処理のはずなのでリスク回避に役立つと思いますよ。それ以外に方法がなければ。
chdir したら rmdir も忘れずに。
やっぱり os_popen からも scriptify を呼んでたみたいですね。4.1.1 のソースコードじゃ判りませんでした。
一応 chdir はアトミックな処理のはずなのでリスク回避に役立つと思いますよ。それ以外に方法がなければ。
chdir したら rmdir も忘れずに。
817デフォルトの名無しさん
2016/09/20(火) 17:06:03.57ID:RIxgZ1yj 間違えた。chdir じゃなくて mkdir です。
818デフォルトの名無しさん
2016/09/22(木) 12:11:24.09ID:nnsRF/zz >>794
どうやら >>801 で想像した通り sprintf の仕様らしい。
本体は builtin.c の format_tree 関数らしい。
最初に 512 バイト確保したバッファは大きくはなっても小さくはならない。
実際の文字列に合わせて確保しなおしたらどうなるか >>800 のテストをしてみたよ。
改造前
element before after diff
1 2753 4757 2004
i 2753 22357 19604
sprintf("%d",i) 2753 151283 148530
sprintf("%d",i) + 0 2753 22376 19623
sprintf("%d",i) "" 2753 30174 27421
改造後
element before after diff
1 2753 4757 2004
i 2753 22357 19604
sprintf("%d",i) 2753 30174 27421
sprintf("%d",i) + 0 2753 22373 19620
sprintf("%d",i) "" 2753 30230 27477
あれ? jessie の gawk と比べてメモリの使用量が少ない。
-DDEBUG 付きでコンパイルしたから増えるかと思ったのに。
まあ、それ以外は一応予想通りではある。
どうやら >>801 で想像した通り sprintf の仕様らしい。
本体は builtin.c の format_tree 関数らしい。
最初に 512 バイト確保したバッファは大きくはなっても小さくはならない。
実際の文字列に合わせて確保しなおしたらどうなるか >>800 のテストをしてみたよ。
改造前
element before after diff
1 2753 4757 2004
i 2753 22357 19604
sprintf("%d",i) 2753 151283 148530
sprintf("%d",i) + 0 2753 22376 19623
sprintf("%d",i) "" 2753 30174 27421
改造後
element before after diff
1 2753 4757 2004
i 2753 22357 19604
sprintf("%d",i) 2753 30174 27421
sprintf("%d",i) + 0 2753 22373 19620
sprintf("%d",i) "" 2753 30230 27477
あれ? jessie の gawk と比べてメモリの使用量が少ない。
-DDEBUG 付きでコンパイルしたから増えるかと思ったのに。
まあ、それ以外は一応予想通りではある。
819デフォルトの名無しさん
2016/09/22(木) 23:15:31.17ID:SYBS8P/o820デフォルトの名無しさん
2016/09/23(金) 02:39:22.63ID:o4qLonoN821デフォルトの名無しさん
2016/09/23(金) 16:06:39.19ID:Y+5MXC/e そんなバカな……と思ってやってみた。
https://ideone.com/jIYn2p
jessie 用のパッケージによる実行結果。
i++ 6.15614
i = i + 1 6.02501
cat " and " dog 13.0163
sprintf 19.1612
インクリメントと足し算の差は有意とは思えない。
連結と sprintf の差は多分、倍くらい。
sprintf の中の複雑さを考えれば意外と差は小さいといえる。
フォーマット文字列が定数なら正規表現みたいにコンパイルすれば
高速化できる……のかなあ? 自分でやってみようとは(今はまだ)思わない。
https://ideone.com/jIYn2p
jessie 用のパッケージによる実行結果。
i++ 6.15614
i = i + 1 6.02501
cat " and " dog 13.0163
sprintf 19.1612
インクリメントと足し算の差は有意とは思えない。
連結と sprintf の差は多分、倍くらい。
sprintf の中の複雑さを考えれば意外と差は小さいといえる。
フォーマット文字列が定数なら正規表現みたいにコンパイルすれば
高速化できる……のかなあ? 自分でやってみようとは(今はまだ)思わない。
822デフォルトの名無しさん
2016/09/24(土) 23:15:47.76ID:+IiHRmp0 Windowsで使えるawkでUnicodeを正しく処理できる(length("あいう")で3が返ってくる)ものは
Cygwin版とVector版以外に無いでしょうか?
Cygwin版とVector版以外に無いでしょうか?
823デフォルトの名無しさん
2016/09/25(日) 10:08:34.07ID:BH82R274 何があったんですか?
http://tanimoto.to/nlp/jgawk/jgawk.html
に書かれているようなことですか? 別の選択肢も一応あるみたいですが。
トランスレータでもいいなら Perl に a2p が同梱されてます。
http://tanimoto.to/nlp/jgawk/jgawk.html
に書かれているようなことですか? 別の選択肢も一応あるみたいですが。
トランスレータでもいいなら Perl に a2p が同梱されてます。
824822
2016/09/25(日) 14:28:36.60ID:MNlfsMjx 特に困りごとは無いのですが、最新のVer4.1.4やその近辺のバージョンで
Unicodeが正しく処理できるものがあれば、今使っているBruce版3.1.7から
乗り換えたいなあと思いまして。
↓の5年前に書かれた記事の頃より選択肢が増えたりしてたら嬉しいなと・・・。
http://blog.livedoor.jp/corbie/archives/3924154.html
Unicodeが正しく処理できるものがあれば、今使っているBruce版3.1.7から
乗り換えたいなあと思いまして。
↓の5年前に書かれた記事の頃より選択肢が増えたりしてたら嬉しいなと・・・。
http://blog.livedoor.jp/corbie/archives/3924154.html
825823
2016/09/26(月) 09:17:05.22ID:bhAuZr+w 理解しました。全滅だったんですね。
Windows での事情は存じませんが、こちらでも取り急ぎ gawk 3.1.5 を make してみました。
ところで、そのページのテスト3は不十分です。
UTF-8 でのパターンマッチは通常文字の誤マッチは原理的に起こりません。起こったらバグです。
だから、UTF-8 に対応しているかどうかをテストするために
sub(/.う/, "U")
というようなものを入れて試してみました。
今ビルドしたばかりの gawk 3.1.5 と jessie のパッケージの gawk 4.1.1 がこのテストに合格しました。
mawk 1.3.3 もインストールされてましたが、こちらはマルチバイト文字に対応していないようです。
さて、結論です。
シフトJIS に対応しているとされるものは避けた方がいいと思います。
余計な改造はしない方が信頼性は高いでしょう。
length がバイト数なのは、単にマルチバイト文字非対応でコンパイルされてるからだと思います。
マルチバイト文字対応版を誰かがリリースしてくれるのを待つか、自分でコンパイルするかですね。
Windows での事情は存じませんが、こちらでも取り急ぎ gawk 3.1.5 を make してみました。
ところで、そのページのテスト3は不十分です。
UTF-8 でのパターンマッチは通常文字の誤マッチは原理的に起こりません。起こったらバグです。
だから、UTF-8 に対応しているかどうかをテストするために
sub(/.う/, "U")
というようなものを入れて試してみました。
今ビルドしたばかりの gawk 3.1.5 と jessie のパッケージの gawk 4.1.1 がこのテストに合格しました。
mawk 1.3.3 もインストールされてましたが、こちらはマルチバイト文字に対応していないようです。
さて、結論です。
シフトJIS に対応しているとされるものは避けた方がいいと思います。
余計な改造はしない方が信頼性は高いでしょう。
length がバイト数なのは、単にマルチバイト文字非対応でコンパイルされてるからだと思います。
マルチバイト文字対応版を誰かがリリースしてくれるのを待つか、自分でコンパイルするかですね。
826デフォルトの名無しさん
2016/09/27(火) 17:33:47.16ID:Icjzq3KF Linux では環境変数 LANG に UTF-8 が入ってないと期待通りに動いてくれません。
正確には LANG というより LC_CTYPE ですが、それはおいといて。
もしかしたらと思って、自分には無用だと思ってた Wine で klabaster gawk 4.1.3 を動かしてみました。
ところが、正規表現にマルチバイト文字が現れた時点で怒られます。
どうやら LANG が無いか、LANG=C じゃなければマルチバイト文字を使えないようです。
そして結局、正規表現の . や length を UTF-8 モードにする方法は見つけられませんでした。
記事のコメントには LC_ALL=ja_JP.UTF-8 で動くって書いてあるのに。
ひょっとして、Windows では原理的にできないということ?
これはいよいよ a2p が現実的な選択肢か?
……と思ったら、出力する Perl コードが間違ってます。
もう降参です。UTF-8 対応の gawk をお望みの方には Linux への引越しを強くお奨めします。
正確には LANG というより LC_CTYPE ですが、それはおいといて。
もしかしたらと思って、自分には無用だと思ってた Wine で klabaster gawk 4.1.3 を動かしてみました。
ところが、正規表現にマルチバイト文字が現れた時点で怒られます。
どうやら LANG が無いか、LANG=C じゃなければマルチバイト文字を使えないようです。
そして結局、正規表現の . や length を UTF-8 モードにする方法は見つけられませんでした。
記事のコメントには LC_ALL=ja_JP.UTF-8 で動くって書いてあるのに。
ひょっとして、Windows では原理的にできないということ?
これはいよいよ a2p が現実的な選択肢か?
……と思ったら、出力する Perl コードが間違ってます。
もう降参です。UTF-8 対応の gawk をお望みの方には Linux への引越しを強くお奨めします。
827デフォルトの名無しさん
2016/09/27(火) 18:24:36.25ID:JiNhKH2a cygwinやmsys2のgawkを使うのはだめなの?
828デフォルトの名無しさん
2016/09/27(火) 18:34:39.64ID:BPXrtVfk Windows Subsystem for Linux (WSL)では、Ubuntu64の実行ファイルが動く。
Linux API を、Windows API へ変換して呼び出す
Ubuntuのパッケージも、apt-getでインストールできる
Linux API を、Windows API へ変換して呼び出す
Ubuntuのパッケージも、apt-getでインストールできる
829デフォルトの名無しさん
2016/09/27(火) 19:26:43.05ID:Icjzq3KF だめというか、見つけられなかった。
ただでさえ Windows のことなんか知らないんだからこれ以上無理。
いい方法を知ってたら教えてあげて。
ただでさえ Windows のことなんか知らないんだからこれ以上無理。
いい方法を知ってたら教えてあげて。
830デフォルトの名無しさん
2016/09/27(火) 19:51:11.26ID:Icjzq3KF Cygwin は試してみたけどインストーラに丁重にお断りされたよ。
831822
2016/09/27(火) 23:10:22.59ID:eGFFwbsN たくさんの情報ありがとうございます。現状でWindowsに拘るなら、Bruce版3.1.7を継続して
使用するか、Cygwin版に乗り換えるか、Windows Subsystem for Linuxで動作させるかの
いずれかになりそうですね。
CygwinやWindows7でのWindows Subsystem for Linuxは、どちらも別途インストールが必要
とのことなので、職場の自PCはともかくスクリプト配布先に(スクリプトを動かすためだけに)
導入してもらわないといけないのはちょっと難しそうです。
Cygwinの導入状況とWindows10への切り替え時期の様子を見つつ、しばらくBruce版3.1.7を
使うことにします。
使用するか、Cygwin版に乗り換えるか、Windows Subsystem for Linuxで動作させるかの
いずれかになりそうですね。
CygwinやWindows7でのWindows Subsystem for Linuxは、どちらも別途インストールが必要
とのことなので、職場の自PCはともかくスクリプト配布先に(スクリプトを動かすためだけに)
導入してもらわないといけないのはちょっと難しそうです。
Cygwinの導入状況とWindows10への切り替え時期の様子を見つつ、しばらくBruce版3.1.7を
使うことにします。
832デフォルトの名無しさん
2016/09/28(水) 07:26:06.87ID:6NcLFLen 実は方法が無いわけではない。シングルバイトモードならできる。でも本当にやりたい?
本当に真剣に必要としているなら、このスクリプトでテスト3をやってみてほしい。
{
c = "[\\000-\\177]|[\\340-\\357][\\200-\\277][\\200-\\277]"
# print( length($0));
str = $0; print( gsub( c,"0",str));
print;
sub(/<tag>/, "");
sub(/<\/tag>/, "");
sub(/hello/, "ABC");
# sub(/.う/, "U");
sub( sprintf("(%s)う",c),"U")
print;
}
本当に真剣に必要としているなら、このスクリプトでテスト3をやってみてほしい。
{
c = "[\\000-\\177]|[\\340-\\357][\\200-\\277][\\200-\\277]"
# print( length($0));
str = $0; print( gsub( c,"0",str));
print;
sub(/<tag>/, "");
sub(/<\/tag>/, "");
sub(/hello/, "ABC");
# sub(/.う/, "U");
sub( sprintf("(%s)う",c),"U")
print;
}
833デフォルトの名無しさん
2016/10/01(土) 22:37:26.49ID:apxhHWta やっぱり klabaster gawk はよく解らない。
$cat u2.awk
{
print( length($0))
sub(/う/, "U")
print;
}
$LANG=C wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
$LANG=ja_JP.EUC-JP wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
$LANG=ja_JP.UTF-8 wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
gawk64: u2.awk:3: sub(//, "U")
gawk64: u2.awk:3: ^ unterminated regexp
gawk64: u2.awk:4: sub(//, "U")
gawk64: u2.awk:4: ^ unexpected newline or end of string
$
UTF-8 で「う」は 3 バイトだから、シフトJISで解釈した結果
その後ろの / もマルチバイト文字の一部になるのだろうか。
いや、UTF-8 で解釈してくれないことに文句を言いたいんじゃないんだ。
UTF-8 で書いてあるのになぜ LANG=ja_JP.UTF-8 の時だけエラーになるのだろう。
$cat u2.awk
{
print( length($0))
sub(/う/, "U")
print;
}
$LANG=C wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
$LANG=ja_JP.EUC-JP wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
$LANG=ja_JP.UTF-8 wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
gawk64: u2.awk:3: sub(//, "U")
gawk64: u2.awk:3: ^ unterminated regexp
gawk64: u2.awk:4: sub(//, "U")
gawk64: u2.awk:4: ^ unexpected newline or end of string
$
UTF-8 で「う」は 3 バイトだから、シフトJISで解釈した結果
その後ろの / もマルチバイト文字の一部になるのだろうか。
いや、UTF-8 で解釈してくれないことに文句を言いたいんじゃないんだ。
UTF-8 で書いてあるのになぜ LANG=ja_JP.UTF-8 の時だけエラーになるのだろう。
834デフォルトの名無しさん
2016/10/02(日) 00:14:27.80ID:lSw/Qfuv この記事を見るかぎりではklabaster以外のWindows版gawkでもダメっぽいです
https://groups.google.com/forum/#!topic/comp.lang.awk/coXxXOpeoXU
https://groups.google.com/forum/#!topic/comp.lang.awk/coXxXOpeoXU
835デフォルトの名無しさん
2016/10/08(土) 21:51:54.06ID:66+5bUgM >>749からのレスで、$が演算子だったの? というようなところが気になって
少し調べてみた(調べたというほどの作業はしてないか)。
まず書籍。手持ちの数冊で確認。
『プログラミング言語AWK』(トッパン 初版第7刷)
さいごのまとめで演算子一覧に記載。本文中(p8)では「欄は常に$1,$2のように
参照しなくてはいけないと思われているかもしれないが、実は$のあとには,欄の
番号を指し示すための任意の式を書いてもよい」と書かれている。また、p46には
「欄変数」の項に「入力行の欄(field)は,$1,$2から始まって,$NFという名で呼ばれる」
との記述がある。
『sed & awk プログラミング』(アスキー出版局 初版)
旧版。本文中(p212)で「フィールドを参照したいときには、フィールド演算子$を使えばよい」
また(p217)で「フィールドを参照するにはドル記号($)演算子を使う」、Appendix(p471)で
「それぞれのフィールドは、$1ならば最初のフィールドの値を参照し、」と表現されている。
Appendixの演算子一覧に記載。
『AWKを256倍使うための本』(アスキー出版局 初版)
Appendixで演算子一覧に記載されているが、本文(p65)で「分解された各フィールドは、
$nという変数(nは、始めのフィールドから順に1,2,3...となる。もちろん即値の代わりに変数を
指定することも可能だ)でアクセスすることができる」とある。他の箇所でも$n変数と書いてある
ところがある。p66で「各フィールドを表す$nであるが、なぜこんな名前になっているかご存じだろうか?
実はこれもUNIX文化からきているのだ。UNIXの代表的なシェルであるshやcsh(最近ではkshや
tcshかな?)のシェルスクリプトのなかでコマンドラインパラメータを表す変数として$nが使用されて
おり(中略)これにあわせてawkで$nが使用されているようなのである」と書いてある。
『AWK実践入門』(技術評論社 初版)
>>766にあるように特別な変数として扱われており、リファレンスにも$が演算子で
あることの記載がない。
(続く)
少し調べてみた(調べたというほどの作業はしてないか)。
まず書籍。手持ちの数冊で確認。
『プログラミング言語AWK』(トッパン 初版第7刷)
さいごのまとめで演算子一覧に記載。本文中(p8)では「欄は常に$1,$2のように
参照しなくてはいけないと思われているかもしれないが、実は$のあとには,欄の
番号を指し示すための任意の式を書いてもよい」と書かれている。また、p46には
「欄変数」の項に「入力行の欄(field)は,$1,$2から始まって,$NFという名で呼ばれる」
との記述がある。
『sed & awk プログラミング』(アスキー出版局 初版)
旧版。本文中(p212)で「フィールドを参照したいときには、フィールド演算子$を使えばよい」
また(p217)で「フィールドを参照するにはドル記号($)演算子を使う」、Appendix(p471)で
「それぞれのフィールドは、$1ならば最初のフィールドの値を参照し、」と表現されている。
Appendixの演算子一覧に記載。
『AWKを256倍使うための本』(アスキー出版局 初版)
Appendixで演算子一覧に記載されているが、本文(p65)で「分解された各フィールドは、
$nという変数(nは、始めのフィールドから順に1,2,3...となる。もちろん即値の代わりに変数を
指定することも可能だ)でアクセスすることができる」とある。他の箇所でも$n変数と書いてある
ところがある。p66で「各フィールドを表す$nであるが、なぜこんな名前になっているかご存じだろうか?
実はこれもUNIX文化からきているのだ。UNIXの代表的なシェルであるshやcsh(最近ではkshや
tcshかな?)のシェルスクリプトのなかでコマンドラインパラメータを表す変数として$nが使用されて
おり(中略)これにあわせてawkで$nが使用されているようなのである」と書いてある。
『AWK実践入門』(技術評論社 初版)
>>766にあるように特別な変数として扱われており、リファレンスにも$が演算子で
あることの記載がない。
(続く)
836835
2016/10/08(土) 22:00:44.45ID:66+5bUgM (続き)
ネットの情報。2016.10.8現在。
Gnu Awk ユーザーズガイド/The GAWK Manual/Effective AWK Programming
gawkの解説書。バージョン違いがあるようだが、翻訳版で目に留まったもの。
「定数でないフィールド番号」の項で「あるフィールドを参照するために、awk言語での任意の式を
`$'の後で使うことができる」と記述されている。「演算子の優先順位」の項では演算子として
並べられている。
man gawk
翻訳版、リナックスコマンドというサイト(www.linux-cmd.com)から。
「入力レコード中の各フィールドの値は、左から $1, $2 等という名前で参照できます。
$0 はレコード全体です。フィールドに値を代入することもできます。フィールドは定数だけでなく、
変数によって参照することもできます。」となっている。演算子のところに記載あり。
AWK Users JP
サイト中「awk 基礎文法最速マスター」のページで「特殊変数」の項に$0,$1〜$NFの説明。
フィールド参照の語はない。また、リファレンス的な演算子のまとめはない(?)。
ページ上部に「この文書は書きかけです」とあるので、未整備ということだろうか。
IBM Knowledge Center
awkコマンドのページ(www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/
com.ibm.aix.cmds1/awk.htm)では「レコードとフィールドによるファイル処理」の項で
「各フィールドはフィールド変数によって参照されます。レコードの最初のフィールドには $1 変数、
2 番目のフィールドには $2 変数というように、変数が割り当てられます。」との記述。少しうしろの
方、「フィールド変数」の項でも「フィールド変数は、$ (ドル記号) とそれに続く数値または数値式で
指定します。」とある。$が演算子であることの記載はない。
てな感じで、『プログラミング言語AWK』でも「欄変数」という表現があり、誤解しそうな感じはする。
また、256倍本に書いてあるようにシェルスクリプト中のパラメータとして$nがあることから、$nが
(特別な)変数として認識されてしまっているのではないか、とも想像する。個人サイトのawkの解説
ページでは、$nという変数にフィールドが代入されると説明しているところもあった。そのように理解して
スクリプトを書いてもさして不都合はないだろうな、とは思うが。
ネットの情報。2016.10.8現在。
Gnu Awk ユーザーズガイド/The GAWK Manual/Effective AWK Programming
gawkの解説書。バージョン違いがあるようだが、翻訳版で目に留まったもの。
「定数でないフィールド番号」の項で「あるフィールドを参照するために、awk言語での任意の式を
`$'の後で使うことができる」と記述されている。「演算子の優先順位」の項では演算子として
並べられている。
man gawk
翻訳版、リナックスコマンドというサイト(www.linux-cmd.com)から。
「入力レコード中の各フィールドの値は、左から $1, $2 等という名前で参照できます。
$0 はレコード全体です。フィールドに値を代入することもできます。フィールドは定数だけでなく、
変数によって参照することもできます。」となっている。演算子のところに記載あり。
AWK Users JP
サイト中「awk 基礎文法最速マスター」のページで「特殊変数」の項に$0,$1〜$NFの説明。
フィールド参照の語はない。また、リファレンス的な演算子のまとめはない(?)。
ページ上部に「この文書は書きかけです」とあるので、未整備ということだろうか。
IBM Knowledge Center
awkコマンドのページ(www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/
com.ibm.aix.cmds1/awk.htm)では「レコードとフィールドによるファイル処理」の項で
「各フィールドはフィールド変数によって参照されます。レコードの最初のフィールドには $1 変数、
2 番目のフィールドには $2 変数というように、変数が割り当てられます。」との記述。少しうしろの
方、「フィールド変数」の項でも「フィールド変数は、$ (ドル記号) とそれに続く数値または数値式で
指定します。」とある。$が演算子であることの記載はない。
てな感じで、『プログラミング言語AWK』でも「欄変数」という表現があり、誤解しそうな感じはする。
また、256倍本に書いてあるようにシェルスクリプト中のパラメータとして$nがあることから、$nが
(特別な)変数として認識されてしまっているのではないか、とも想像する。個人サイトのawkの解説
ページでは、$nという変数にフィールドが代入されると説明しているところもあった。そのように理解して
スクリプトを書いてもさして不都合はないだろうな、とは思うが。
837デフォルトの名無しさん
2016/10/08(土) 23:11:50.50ID:ZMh6U7O9 広範な調査乙。Gawkのrefcardでもちゃんとoperatorに含まれているなあ。
演算子と明確に認識していなくても、$の後に式OKと思っていれば差し支えなさそう。
演算子と明確に認識していなくても、$の後に式OKと思っていれば差し支えなさそう。
838デフォルトの名無しさん
2016/10/18(火) 23:10:18.54ID:TQpGgbw6 gawk4で関数ポインタみたいなもんが追加されましたけど、これlengthとかsubstrの
組込み関数や@loadした自作dllの関数とかにも使えるんですね
案外便利かも
@load "hage.dll"
BEGIN{
kumi = "length"
func = "hagefunc"
ng[1] = "substr"
print @kumi("ABC")
print @func("彡 ⌒ ミ ")
print @ng[1]("XYZ", 1, 1) # 配列越しに呼ぼうとしたらsyntax error・・・残念
}
組込み関数や@loadした自作dllの関数とかにも使えるんですね
案外便利かも
@load "hage.dll"
BEGIN{
kumi = "length"
func = "hagefunc"
ng[1] = "substr"
print @kumi("ABC")
print @func("彡 ⌒ ミ ")
print @ng[1]("XYZ", 1, 1) # 配列越しに呼ぼうとしたらsyntax error・・・残念
}
839デフォルトの名無しさん
2016/10/21(金) 17:10:59.85ID:MQQBNMPM >>756
こういう過疎スレで無駄に突っかかってくるやつむかつくんだが死ね
こういう過疎スレで無駄に突っかかってくるやつむかつくんだが死ね
840デフォルトの名無しさん
2016/11/23(水) 00:01:26.03ID:bt3mTQnz >>839
ブーメランかよwww
ブーメランかよwww
841デフォルトの名無しさん
2016/11/23(水) 01:18:15.98ID:noM2Pdp3 \おはげだー!/
842デフォルトの名無しさん
2016/11/30(水) 02:56:38.28ID:PeC/aWZc843C初心者
2017/02/28(火) 13:18:15.09ID:Mb8mQo1M awkスクリプトをCソースに変換してコンパイルするための「awka」というツールでできるだけ簡単にUTF−8サポートさせる方法を知りたいです。
ネットで散々調べましたがないようです?
ネットで散々調べましたがないようです?
844デフォルトの名無しさん
2017/03/02(木) 00:28:53.73ID:CDxvUfiY このスレも10周年か
845デフォルトの名無しさん
2017/03/05(日) 09:28:55.73ID:EQCsqksH846デフォルトの名無しさん
2017/03/05(日) 14:45:26.28ID:KmKKYedf gawkに対応してるなら大丈夫ってことかな?
asciiしか考えていないなら、ソース全チェック…。
要するに、日本語化するんだろうけど。
全然別の言語変換にちょっと咬んだことがあるんだけど、
製品化しちゃってからダブルバイト考慮してないことがわかって、かなり面倒だった。
とりあえず変換してから、ソース見て直すほうが早かったり(笑
がんばってね。
asciiしか考えていないなら、ソース全チェック…。
要するに、日本語化するんだろうけど。
全然別の言語変換にちょっと咬んだことがあるんだけど、
製品化しちゃってからダブルバイト考慮してないことがわかって、かなり面倒だった。
とりあえず変換してから、ソース見て直すほうが早かったり(笑
がんばってね。
847デフォルトの名無しさん
2017/03/06(月) 11:39:31.22ID:FdaYmB9f awkで $1,$2...$6 こんな出力を↓下にしたいんだけど どうすればいいですかね?
470230
470290
↓
002347
002479
470230
470290
↓
002347
002479
848デフォルトの名無しさん
2017/03/06(月) 12:33:46.83ID:FW5jfGh1 GNU awk の asort() を使うとか。
printf '470230\n470290\n' |
gawk -vFS= -vOFS= '{
for(i=1;i<=NF;i++){
arr[i]=$i
};
asort(arr);
for(i=1;i<=NF;i++){
$i=arr[i]
};
print
}'
printf '470230\n470290\n' |
gawk -vFS= -vOFS= '{
for(i=1;i<=NF;i++){
arr[i]=$i
};
asort(arr);
for(i=1;i<=NF;i++){
$i=arr[i]
};
}'
849デフォルトの名無しさん
2017/03/06(月) 15:19:43.83ID:FdaYmB9f ありがとう
gawk いれないでなんとかならないかな
gawk いれないでなんとかならないかな
850デフォルトの名無しさん
2017/03/06(月) 17:28:40.15ID:FW5jfGh1 う〜ん、そうなると awk を使わなくてもいいかな
printf '470230\n470290\n' |
while read -r n
do
echo "$n" | grep -o . | sort -n | tr -d '\n'; echo
done
printf '470230\n470290\n' |
while read -r n
do
echo "$n" | grep -o . | sort -n | tr -d '\n'; echo
done
851デフォルトの名無しさん
2017/03/06(月) 19:23:27.89ID:08XsJPyW852デフォルトの名無しさん
2017/03/06(月) 19:24:30.15ID:08XsJPyW853デフォルトの名無しさん
2017/03/06(月) 19:26:33.18ID:08XsJPyW >>840
ブーメランとかじゃなくて死ねって言ってんだから死ねボケ
ブーメランとかじゃなくて死ねって言ってんだから死ねボケ
854デフォルトの名無しさん
2017/03/07(火) 08:17:48.93ID:6Hf5Xh2e お疲れ様でした
855デフォルトの名無しさん
2017/03/09(木) 21:48:39.65ID:0T9qj2kA 連想配列で
echo '470230' | awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++){a[$i]++}for(i=0;i<=9;i++){for(j=1;j<=a[i];j++){printf("%s", i)}}printf("\n")}'
002347
echo '470230' | awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++){a[$i]++}for(i=0;i<=9;i++){for(j=1;j<=a[i];j++){printf("%s", i)}}printf("\n")}'
002347
856デフォルトの名無しさん
2017/03/10(金) 00:18:57.87ID:+B1nKlhG 既に否定されているがgawk4がもし使えたら
awk '{ORS="";PROCINFO["sorted_in"]="@val_num_asc";x=split($0,a,"");for (i in a)print a[i];print "\n"}'
awk '{ORS="";PROCINFO["sorted_in"]="@val_num_asc";x=split($0,a,"");for (i in a)print a[i];print "\n"}'
857デフォルトの名無しさん
2017/03/10(金) 04:05:38.25ID:wGo6zQ56 最近の gawk ならインクルードファイルが用意されてて join とか使えたり
gawk -vFS= -vOFS= -i join.awk '{split($0,a,"");asort(a);print join(a,1,length(a),SUBSEP)}'
gawk -vFS= -vOFS= -i join.awk '{split($0,a,"");asort(a);print join(a,1,length(a),SUBSEP)}'
858デフォルトの名無しさん
2017/04/04(火) 22:35:43.00ID:9/WMFGSO # gawk4の読込みタイムアウト機能、けっこう便利そう・・・だけどWindowsはCygwin版じゃないと使えない。残念無念。
BEGIN{
PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 180000
print "3分間待ってやる"
getline t < "/dev/stdin"
if (t=="バルス") {
print "ああ…ああ…目があぁぁぁぁぁ〜!"
}
else {
print "時間だ!答えを訊こう!"
}
}
BEGIN{
PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 180000
print "3分間待ってやる"
getline t < "/dev/stdin"
if (t=="バルス") {
print "ああ…ああ…目があぁぁぁぁぁ〜!"
}
else {
print "時間だ!答えを訊こう!"
}
}
859デフォルトの名無しさん
2017/09/16(土) 00:02:08.63ID:lO9EtkAG 自作の読込みパーサextensionでgz形式のファイルを食えるようにしてみたけど
パーサは一度にひとつしかロードできない設計らしく(ソースでそうなってた)
同じ読込みパーサ形式のxmlライブラリとは併用できなかった
ちょっと使いにくいなあ・・・
パーサは一度にひとつしかロードできない設計らしく(ソースでそうなってた)
同じ読込みパーサ形式のxmlライブラリとは併用できなかった
ちょっと使いにくいなあ・・・
860デフォルトの名無しさん
2017/10/09(月) 16:41:58.59ID:7/rU/a8H 4.2.0Betaあげ
861デフォルトの名無しさん
2017/10/16(月) 14:34:21.07ID:tJ1aGDYb ファイルの終端関係の謎のエラーに直面
「何で行末が欠ける?分からん、全然分からんぞ!」
と悶えていたら、
いつの間にかvimの設定が変になっていて、
書いたファイルがデフォで行末に\rが来る
ようになっていた。
brew でインストールvimインストールしたとき
妙な設定になったのか?
いやねawkのスクリプトで、
空フィールドが\rになったりとか
macOSなのに変だなあと思っていたのだが…
システム外vim使うときは要注意か。
「何で行末が欠ける?分からん、全然分からんぞ!」
と悶えていたら、
いつの間にかvimの設定が変になっていて、
書いたファイルがデフォで行末に\rが来る
ようになっていた。
brew でインストールvimインストールしたとき
妙な設定になったのか?
いやねawkのスクリプトで、
空フィールドが\rになったりとか
macOSなのに変だなあと思っていたのだが…
システム外vim使うときは要注意か。
862デフォルトの名無しさん
2017/10/16(月) 14:41:37.20ID:tJ1aGDYb うぉーっ、林檎のnumbersで書き出したCSVファイルが
DOS改行になっとる…罠だ
DOS改行になっとる…罠だ
863デフォルトの名無しさん
2017/10/22(日) 23:24:45.88ID:/qEHJ0vm お疲れ様でした
864デフォルトの名無しさん
2017/10/22(日) 23:26:23.47ID:/qEHJ0vm >>756
普段話題なく3年も続こうがべつにすごくないね
普段話題なく3年も続こうがべつにすごくないね
865デフォルトの名無しさん
2017/12/09(土) 10:00:30.84ID:/kecouyU BEGIN{for(i=1;i<=10000000;i++){printf "%08d", i > "test" } close("test)} の実行にかかる時間を
4.1.4と4.2.0で比較すると、4.2.0のほうが倍近く速くなってるね
fwriteのロックがどうたらの影響なんだろうけど
4.1.4と4.2.0で比較すると、4.2.0のほうが倍近く速くなってるね
fwriteのロックがどうたらの影響なんだろうけど
866デフォルトの名無しさん
2017/12/12(火) 21:01:15.07ID:zxiueT/o 懐かしいなぁ。
AWKは自由に現実的な限度はあるけど、書いてて楽しい言語だった。
AWKは自由に現実的な限度はあるけど、書いてて楽しい言語だった。
867デフォルトの名無しさん
2018/01/08(月) 11:00:30.57ID:szpKYJOz お疲れ様でした
868デフォルトの名無しさん
2018/01/12(金) 00:18:25.22ID:8Bbkgawk IDがgawkなので来ました
869デフォルトの名無しさん
2018/01/17(水) 10:09:56.59ID:MoHAEd1l AWKって基本的にUnicodeには対応してるんだよね。
GNUにしろBSDにしろ。
GNUにしろBSDにしろ。
870デフォルトの名無しさん
2018/01/17(水) 17:52:56.47ID:MoHAEd1l 置換函数の第二仮引数に[バックスペース][置換対象の文字列]みたいにしたい時は
gsub(/foo/, "\\\\&", $n)
ってしないといけないんだね。
gsub(/foo/, "\\bar", $n)
が foo -> \bar だったんで foo -> \foo は
gsub(/foo/, "\\&", $n)
でいいと思って半時程嵌った。
gsub(/foo/, "\\\\&", $n)
ってしないといけないんだね。
gsub(/foo/, "\\bar", $n)
が foo -> \bar だったんで foo -> \foo は
gsub(/foo/, "\\&", $n)
でいいと思って半時程嵌った。
871デフォルトの名無しさん
2018/01/18(木) 07:25:24.80ID:eRgrS92p872デフォルトの名無しさん
2018/03/09(金) 13:30:21.59ID:Yd19z7Tx ある行に 20 と 34 とはいってる
この行ごと除外したいけど・・・
この行ごと除外したいけど・・・
873デフォルトの名無しさん
2018/03/09(金) 14:33:06.31ID:X3i0O3oy grep -v ' 20 と 34 '
874デフォルトの名無しさん
2018/03/09(金) 21:38:00.87ID:3i0y1Him こうかな
gawk "$0!~/20|34/{print}"
gawk "$0!~/20|34/{print}"
875デフォルトの名無しさん
2018/03/09(金) 23:45:36.30ID:Ejthnyow AWK プログラムの基本構造となっている「パターンとアクションの対」のうち、
アクションが省略されている場合は入力行がそのまま出力される。
またパターンが単一の正規表現である場合は、その正規表現と $0 との照合が行われる。
gawk '!/20と34/'
gawk '!/20|34/'
アクションが省略されている場合は入力行がそのまま出力される。
またパターンが単一の正規表現である場合は、その正規表現と $0 との照合が行われる。
gawk '!/20と34/'
gawk '!/20|34/'
876デフォルトの名無しさん
2018/03/10(土) 21:39:17.88ID:NqpdHf3N こぴぺしてやってみたけど 両方消えちゃうんだよね
20 と 34があった場合 出力しない
片方でもあれば 出力する
awk '!/01 / && !/03 /' これも両方消えてる・・
20 と 34があった場合 出力しない
片方でもあれば 出力する
awk '!/01 / && !/03 /' これも両方消えてる・・
2018/03/11(日) 06:07:55.06ID:rsmr5+n0
878デフォルトの名無しさん
2018/03/11(日) 10:58:35.24ID:tN+YLJlR ありがとう
()はきがつかなかった・・
()はきがつかなかった・・
879デフォルトの名無しさん
2018/05/23(水) 20:10:48.40ID:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
0VDE5
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
0VDE5
880デフォルトの名無しさん
2018/06/08(金) 22:00:41.48ID:W8HYHVfd split関数より$0へ代入したほうが速いage
881デフォルトの名無しさん
2018/07/04(水) 22:29:02.55ID:gFgZc5FG 02P
882デフォルトの名無しさん
2018/07/05(木) 16:52:56.22ID:AeL6VB/V 0VDE5
883デフォルトの名無しさん
2018/09/11(火) 09:26:39.50ID:196Ukd9B シェルスクリプト書いててどうしようもないときだけ使ってる
884デフォルトの名無しさん
2018/12/02(日) 13:44:27.64ID:jISJOvCb AWKって重いと勝手に思ってたけど下手にシェルで制御構文作るより早いね
尤もWSLでやってるのでforkの時間とかそういう問題かもしれないが。
尤もWSLでやってるのでforkの時間とかそういう問題かもしれないが。
885デフォルトの名無しさん
2018/12/02(日) 14:22:41.55ID:Bx+z5yQP >>884
重いと言ってもC比だからな。
今時の超大富豪言語PythonやRubyとなら同程度でもおかしくはない。
Cygwinのshが重かったのはご存じの通りforkが原因だ。
気になるならVirtualBox等でlinux環境を構築してその上でテストしてみればいい。
重いと言ってもC比だからな。
今時の超大富豪言語PythonやRubyとなら同程度でもおかしくはない。
Cygwinのshが重かったのはご存じの通りforkが原因だ。
気になるならVirtualBox等でlinux環境を構築してその上でテストしてみればいい。
886デフォルトの名無しさん
2018/12/22(土) 02:10:55.36ID:V7w17XLB gawk4にて配列の配列に存在する全要素数を
カウントする関数を作ったんですが、
もっと早いコードにならないでしょうか?
どなたかヒントをください。お願いします。
function count_array(arr, n, i) {
for (i in arr) {
if (isarray(arr[i])) count_array(arr[i], n);
else n[0]++;
}
return n[0];
}
カウントする関数を作ったんですが、
もっと早いコードにならないでしょうか?
どなたかヒントをください。お願いします。
function count_array(arr, n, i) {
for (i in arr) {
if (isarray(arr[i])) count_array(arr[i], n);
else n[0]++;
}
return n[0];
}
887デフォルトの名無しさん
2018/12/22(土) 02:57:46.65ID:kZtDaodg length(arr) でダメなの?
888デフォルトの名無しさん
2018/12/22(土) 20:12:58.98ID:VPYzPSxJ 886です。
ダメなんです。
BEGIN {
a[1] = 1;
a[2][1] = 21;
a[2][2] = 22;
a[3] = 3;
a[4][1][1] = 411;
a[4][2] = 42;
a[4][3][2][1] = 256;
for (i = 0; i < 9; i++) b[i] = i;
c["foo"]["corge"] = "grault";
c["foo"]["bar"] = "garply";
c["baz"]["corge"] = "waldo";
c["baz"]["quux"] = "fred";
print "length(a) = " length(a);
print "length(a) = " length(b);
print "length(a) = " length(c);
print "count_array(a) = " count_array(a);
print "count_array(b) = " count_array(b);
print "count_array(c) = " count_array(c);
}
length(a) = 4
length(b) = 9
length(c) = 2
count_array(a) = 7
count_array(b) = 9
count_array(c) = 4
再帰を使う以外に方法があれば、
と思い質問した次第です。
ダメなんです。
BEGIN {
a[1] = 1;
a[2][1] = 21;
a[2][2] = 22;
a[3] = 3;
a[4][1][1] = 411;
a[4][2] = 42;
a[4][3][2][1] = 256;
for (i = 0; i < 9; i++) b[i] = i;
c["foo"]["corge"] = "grault";
c["foo"]["bar"] = "garply";
c["baz"]["corge"] = "waldo";
c["baz"]["quux"] = "fred";
print "length(a) = " length(a);
print "length(a) = " length(b);
print "length(a) = " length(c);
print "count_array(a) = " count_array(a);
print "count_array(b) = " count_array(b);
print "count_array(c) = " count_array(c);
}
length(a) = 4
length(b) = 9
length(c) = 2
count_array(a) = 7
count_array(b) = 9
count_array(c) = 4
再帰を使う以外に方法があれば、
と思い質問した次第です。
889デフォルトの名無しさん
2018/12/22(土) 21:58:49.47ID:b6CiPLFa 要素を追加するときに
ノード毎に集計値が必要ならそれぞれのノード毎の集計値を保存しとけばいい
そうすれば集計しなおす必要ない
超速いハズ
集計しないからな
ノード毎に集計値が必要ならそれぞれのノード毎の集計値を保存しとけばいい
そうすれば集計しなおす必要ない
超速いハズ
集計しないからな
890デフォルトの名無しさん
2018/12/22(土) 22:19:10.29ID:b6CiPLFa こういった集計値がほしいのは分かる
aho(9)
┣aho1(5)
┃┣aho11(3)
┃┃┣aho111(1)
┃┃┗aho112(1)
┃┗aho12(1)
┗aho2(3)
┣aho21(1)
┗aho22(1)
lengthでは、きっとこんな感じでしかとれない
aho(2)
┣aho1(2)
┃┣aho11(2)
┃┃┣aho111(n/a)
┃┃┗aho112(n/a)
┃┗aho12(n/a)
┗aho2(2)
┣aho21(n/a)
┗aho22(n/a)
aho(9)
┣aho1(5)
┃┣aho11(3)
┃┃┣aho111(1)
┃┃┗aho112(1)
┃┗aho12(1)
┗aho2(3)
┣aho21(1)
┗aho22(1)
lengthでは、きっとこんな感じでしかとれない
aho(2)
┣aho1(2)
┃┣aho11(2)
┃┃┣aho111(n/a)
┃┃┗aho112(n/a)
┃┗aho12(n/a)
┗aho2(2)
┣aho21(n/a)
┗aho22(n/a)
891デフォルトの名無しさん
2018/12/22(土) 23:48:44.15ID:omdhpVTe >>888
lengthは、配列aの要素に配列があると要素としての配列の
中の要素数まではカウントしない、やりたいのは要素としての配列に
含まれる要素もカウントしたい、ということか。
function count_array2(arr, cnt, i) {
n=0;
for (i in arr) {
if(isarray(arr[i])){
cnt+=length(arr[i]);
}
else n++;
}
return n;
}
だと
a[1] = 1;
a[2][1] = 21;
a[2][2] = 22;
a[3] = 3;
a[4][1][1] = 411;
a[4][2] = 42;
a[4][3][2][1] = 256;
a[4][3][3][2] = 257;
みたいなのでうまくいかない(1番目と2番目の添え字(?)が同じ)。
arr[i][j]...と続ければ(最初にlength(arr)で続ける深さを決めて)
いけるように思うが、だったら再帰するのが素直か。
lengthは、配列aの要素に配列があると要素としての配列の
中の要素数まではカウントしない、やりたいのは要素としての配列に
含まれる要素もカウントしたい、ということか。
function count_array2(arr, cnt, i) {
n=0;
for (i in arr) {
if(isarray(arr[i])){
cnt+=length(arr[i]);
}
else n++;
}
return n;
}
だと
a[1] = 1;
a[2][1] = 21;
a[2][2] = 22;
a[3] = 3;
a[4][1][1] = 411;
a[4][2] = 42;
a[4][3][2][1] = 256;
a[4][3][3][2] = 257;
みたいなのでうまくいかない(1番目と2番目の添え字(?)が同じ)。
arr[i][j]...と続ければ(最初にlength(arr)で続ける深さを決めて)
いけるように思うが、だったら再帰するのが素直か。
892デフォルトの名無しさん
2018/12/23(日) 00:54:43.50ID:quoNoaXg 886です。889さんこんな感じでしょうか?
BEGIN {
addnode(a, "1-1", "start");
addnode(a, "1-2", "done");
addnode(a, "1-3", "result");
addnode(a, "1-4", "print");
addnode(a, "2", "count");
addnode(a, "3-1-1", "return");
for (i in a[1]) print "a[1][" i "] = " a[1][i];
print "a[2] = " a[2];
print "a[3][1][1] = " a[3][1][1];
print "\n_ele_sum = " _ele_sum;
}
function addnode(arr, i, val, p) {
ct = split(i, list, "-");
switch (ct) {
case 1: arr[list[1]] = val; break;
case 2: arr[list[1]][list[2]] = val; break;
case 3: arr[list[1]][list[2]][list[3]] = val; break;
default:
}
_ele_sum++;
}
a[1][1] = start
a[1][2] = done
a[1][3] = result
a[1][4] = print
a[2] = count
a[3][1][1] = return
_ele_sum = 6
BEGIN {
addnode(a, "1-1", "start");
addnode(a, "1-2", "done");
addnode(a, "1-3", "result");
addnode(a, "1-4", "print");
addnode(a, "2", "count");
addnode(a, "3-1-1", "return");
for (i in a[1]) print "a[1][" i "] = " a[1][i];
print "a[2] = " a[2];
print "a[3][1][1] = " a[3][1][1];
print "\n_ele_sum = " _ele_sum;
}
function addnode(arr, i, val, p) {
ct = split(i, list, "-");
switch (ct) {
case 1: arr[list[1]] = val; break;
case 2: arr[list[1]][list[2]] = val; break;
case 3: arr[list[1]][list[2]][list[3]] = val; break;
default:
}
_ele_sum++;
}
a[1][1] = start
a[1][2] = done
a[1][3] = result
a[1][4] = print
a[2] = count
a[3][1][1] = return
_ele_sum = 6
893デフォルトの名無しさん
2018/12/23(日) 01:05:13.25ID:quoNoaXg 886です。
pとか関係ないパラメータ入れてしまってごめんなさい。
addnode(a, "1-5-1", "connot");
これができません。
a["5"]がスカラーだと言っています。
pとか関係ないパラメータ入れてしまってごめんなさい。
addnode(a, "1-5-1", "connot");
これができません。
a["5"]がスカラーだと言っています。
894デフォルトの名無しさん
2018/12/23(日) 01:15:19.57ID:quoNoaXg 訂正a["1"]["5"]がスカラーの文脈だと言っています。でした
895デフォルトの名無しさん
2018/12/23(日) 01:41:32.84ID:quoNoaXg 886です
for (i in a[1]) print "a[1][" i "] = " a[1][i];
でa[1][5][1]が引っかかっていたようです。
自爆でした。すみません。
for (i in a[1]) print "a[1][" i "] = " a[1][i];
でa[1][5][1]が引っかかっていたようです。
自爆でした。すみません。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】UEFA-CL準決勝第2戦 インテル×バルセロナ [久太郎★]
- 日テレ「マジカル頭脳パワー!!」「THE夜もヒッパレ」「天声慎吾」「歌の大辞テン」など装い新たに蘇る [ひかり★]
- 【文春】《記事予告》国民的女優&人気俳優 不倫スクープ第2弾 ★4 [Ailuropoda melanoleuca★]
- アイヌに対する差別偏見“見聞きしたことある”回答の1割 政府 [香味焙煎★]
- 【文春】《記事予告》国民的女優&人気俳優 不倫スクープ第2弾 ★5 [Ailuropoda melanoleuca★]
- イギリス、反移民を掲げる右派ポピュリスト政党が1600議席中677議席の大躍進―英地方議会選 ★2 [お断り★]
- 国家公務員、通勤手当上限15万円(原資は血税)を利用し、優雅に片道3時間の新幹線通勤を始めてしまう [753450607]
- 【速報】第四次印パ戦争開戦 [972432215]
- 【速報】インド、パキスタンにミサイル発射WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
- 日本テレビ、『マジカル頭脳パワー!!』『THE 夜もヒッパレ』『天声慎吾』などが復活 [462275543]
- ワイ社畜、吐く🤮
- 【動画】「白い小さいおじさんが歩いている」競走馬生産牧場が投稿した謎の物体映像 [737440712]