16/09/18 19:56:17.75 zTPoEkjL.net
>>812
vectorの配布ファイル内のreadmeにはソースコードの
公開場所を探してるとか、直接連絡すれば渡すとか書いてある。
Windows版、NTあたりから一時ファイル作らずにパイプ動作するように
なったとか、どこかで読んだ気がするけど。
824:デフォルトの名無しさん
16/09/18 22:03:20.37 KtcAr9oX.net
謎は解けた。
ファイルを使ってデータを渡すのはマクロ __DJGPP__ とマクロ __MINGW32__ が
いずれも定義されていない場合らしいです。
Vector のは MINGW なので該当しません。お騒がせしました。
825:デフォルトの名無しさん
16/09/19 11:56:06.00 iIvzjj/t.net
ファイルを経由していても、ストレージに書き込むとは限らない
メモリ上だけに存在する、ファイルもあり得る。
LinuxのRAMディスク、tmpfs とか
826:803
16/09/19 14:26:19.66 fDWhtT6v.net
>>812
情報ありがとうございます。>>804で書いた「ヘンテコな処理」をpc\popen.c内に確認できました。
scriptify関数のtempnam呼んでるところでプロセスIDもつけるなり、細工したいなあ・・・
827:デフォルトの名無しさん
16/09/20 17:00:26.41 RIxgZ1yj.net
先日アクセスできなかった GNU のサイトが復活してたので 3.1.5 のソースコードを入手できました。
やっぱり os_popen からも scriptify を呼んでたみたいですね。4.1.1 のソースコードじゃ判りませんでした。
一応 chdir はアトミックな処理のはずなのでリスク回避に役立つと思いますよ。それ以外に方法がなければ。
chdir したら rmdir も忘れずに。
828:デフォルトの名無しさん
16/09/20 17:06:03.57 RIxgZ1yj.net
間違えた。chdir じゃなくて mkdir です。
829:デフォルトの名無しさん
16/09/22 12:11:24.09 nnsRF/zz.net
>>795
どうやら >>802 で想像した通り sprintf の仕様らしい。
本体は builtin.c の format_tree 関数らしい。
最初に 512 バイト確保したバッファは大きくはなっても小さくはならない。
実際の文字列に合わせて確保しなおしたらどうなるか >>801 のテストをしてみたよ。
改造前
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 付きでコンパイルしたから増えるかと思ったのに。
まあ、それ以外は一応予想通りではある。
830:デフォルトの名無しさん
16/09/22 23:15:31.17 SYBS8P/o.net
>>794とか
文字列の連結は "A" "B" よりもsprintf("%s%s", "A", "B") の方が速いとか
gawkって結構クセありますね
831:デフォルトの名無しさん
16/09/23 02:39:22.63 o4qLonoN.net
>>820
> 文字列の連結は "A" "B" よりもsprintf("%s%s", "A", "B") の方が速い
マジか。逆だと聞いていたが。
832:デフォルトの名無しさん
16/09/23 16:06:39.19 Y+5MXC/e.net
そんなバカな……と思ってやってみた。
URLリンク(ideone.com)
jessie 用のパッケージによる実行結果。
i++ 6.15614
i = i + 1 6.02501
cat " and " dog 13.0163
sprintf 19.1612
インクリメントと足し算の差は有意とは思えない。
連結と sprintf の差は多分、倍くらい。
sprintf の中の複雑さを考えれば意外と差は小さいといえる。
フォーマット文字列が定数なら正規表現みたいにコンパイルすれば
高速化できる……のかなあ? 自分でやってみようとは(今はまだ)思わない。
833:デフォルトの名無しさん
16/09/24 23:15:47.76 +IiHRmp0.net
Windowsで使えるawkでUnicodeを正しく処理できる(length("あいう")で3が返ってくる)ものは
Cygwin版とVector版以外に無いでしょうか?
834:デフォルトの名無しさん
16/09/25 10:08:34.07 BH82R274.net
何があったんですか?
URLリンク(tanimoto.to)
に書かれているようなことですか? 別の選択肢も一応あるみたいですが。
トランスレータでもいいなら Perl に a2p が同梱されてます。
835:822
16/09/25 14:28:36.60 MNlfsMjx.net
特に困りごとは無いのですが、最新のVer4.1.4やその近辺のバージョンで
Unicodeが正しく処理できるものがあれば、今使っているBruce版3.1.7から
乗り換えたいなあと思いまして。
↓の5年前に書かれた記事の頃より選択肢が増えたりしてたら嬉しいなと・・・。
URLリンク(blog.livedoor.jp)
836:823
16/09/26 09:17:05.22 bhAuZr+w.net
理解しました。全滅だったんですね。
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 がバイト数なのは、単にマルチバイト文字非対応でコンパイルされてるからだと思います。
マルチバイト文字対応版を誰かがリリースしてくれるのを待つか、自分でコンパイルするかですね。
837:デフォルトの名無しさん
16/09/27 17:33:47.16 Icjzq3KF.net
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 への引越しを強くお奨めします。
838:デフォルトの名無しさん
16/09/27 18:24:36.25 JiNhKH2a.net
cygwinやmsys2のgawkを使うのはだめなの?
839:デフォルトの名無しさん
16/09/27 18:34:39.64 BPXrtVfk.net
Windows Subsystem for Linux (WSL)では、Ubuntu64の実行ファイルが動く。
Linux API を、Windows API へ変換して呼び出す
Ubuntuのパッケージも、apt-getでインストールできる
840:デフォルトの名無しさん
16/09/27 19:26:43.05 Icjzq3KF.net
だめというか、見つけられなかった。
ただでさえ Windows のことなんか知らないんだからこれ以上無理。
いい方法を知ってたら教えてあげて。
841:デフォルトの名無しさん
16/09/27 19:51:11.26 Icjzq3KF.net
Cygwin は試してみたけどインストーラに丁重にお断りされたよ。
842:822
16/09/27 23:10:22.59 eGFFwbsN.net
たくさんの情報ありがとうございます。現状でWindowsに拘るなら、Bruce版3.1.7を継続して
使用するか、Cygwin版に乗り換えるか、Windows Subsystem for Linuxで動作させるかの
いずれかになりそうですね。
CygwinやWindows7でのWindows Subsystem for Linuxは、どちらも別途インストールが必要
とのことなので、職場の自PCはともかくスクリプト配布先に(スクリプトを動かすためだけに)
導入してもらわないといけないのはちょっと難しそうです。
Cygwinの導入状況とWindows10への切り替え時期の様子を見つつ、しばらくBruce版3.1.7を
使うことにします。
843:デフォルトの名無しさん
16/09/28 07:26:06.87 6NcLFLen.net
実は方法が無いわけではない。シングルバイトモードならできる。でも本当にやりたい?
本当に真剣に必要としているなら、このスクリプトでテスト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;
}
844:デフォルトの名無しさん
16/10/01 22:37:26.49 apxhHWta.net
やっぱり 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 の時だけエラーになるのだろう。
845:デフォルトの名無しさん
16/10/02 00:14:27.80 lSw/Qfuv.net
この記事を見るかぎりではklabaster以外のWindows版gawkでもダメっぽいです
URLリンク(groups.google.com)
846:デフォルトの名無しさん
16/10/08 21:51:54.06 66+5bUgM.net
>>748からのレスで、$が演算子だったの? というようなところが気になって
少し調べてみた(調べたというほどの作業はしてないか)。
まず書籍。手持ちの数冊で確認。
『プログラミング言語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実践入門』(技術評論社 初版)
>>765にあるように特別な変数として扱われており、リファレンスにも$が演算子で
あることの記載がない。
(続く)
847:835
16/10/08 22:00:44.45 66+5bUgM.net
(続き)
ネットの情報。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という変数にフィールドが代入されると説明しているところもあった。そのように理解して
スクリプトを書いてもさして不都合はないだろうな、とは思うが。
848:デフォルトの名無しさん
16/10/08 23:11:50.50 ZMh6U7O9.net
広範な調査乙。Gawkのrefcardでもちゃんとoperatorに含まれているなあ。
演算子と明確に認識していなくても、$の後に式OKと思っていれば差し支えなさそう。
849:デフォルトの名無しさん
16/10/18 23:10:18.54 TQpGgbw6.net
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・・・残念
}
850:デフォルトの名無しさん
16/10/21 17:10:59.85 MQQBNMPM.net
>>755
こういう過疎スレで無駄に突っかかってくるやつむかつくんだが死ね
851:デフォルトの名無しさん
16/11/23 00:01:26.03 bt3mTQnz.net
>>840
ブーメランかよwww
852:デフォルトの名無しさん
16/11/23 01:18:15.98 noM2Pdp3.net
\おはげだー!/
853:デフォルトの名無しさん
16/11/30 02:56:38.28 PeC/aWZc.net
URLリンク(imgur.com)
854:C初心者
17/02/28 13:18:15.09 Mb8mQo1M.net
awkスクリプトをCソースに変換してコンパイルするための「awka」というツールでできるだけ簡単にUTF-8サポートさせる方法を知りたいです。
ネットで散々調べましたがないようです?
855:デフォルトの名無しさん
17/03/02 00:28:53.73 CDxvUfiY.net
このスレも10周年か
856:デフォルトの名無しさん
17/03/05 09:28:55.73 EQCsqksH.net
>>844
それがあなたの現在の実力だったということです
お疲れ様でした
857:デフォルトの名無しさん
17/03/05 14:45:26.28 KmKKYedf.net
gawkに対応してるなら大丈夫ってことかな?
asciiしか考えていないなら、ソース全チェック…。
要するに、日本語化するんだろうけど。
全然別の言語変換にちょっと咬んだことがあるんだけど、
製品化しちゃってからダブルバイト考慮してないことがわかって、かなり面倒だった。
とりあえず変換してから、ソース見て直すほうが早かったり(笑
がんばってね。
858:デフォルトの名無しさん
17/03/06 11:39:31.22 FdaYmB9f.net
awkで $1,$2...$6 こんな出力を↓下にしたいんだけど どうすればいいですかね?
470230
470290
↓
002347
002479
859:デフォルトの名無しさん
17/03/06 12:33:46.83 FW5jfGh1.net
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]
};
}'
860:デフォルトの名無しさん
17/03/06 15:19:43.83 FdaYmB9f.net
ありがとう
gawk いれないでなんとかならないかな
861:デフォルトの名無しさん
17/03/06 17:28:40.15 FW5jfGh1.net
う~ん、そうなると awk を使わなくてもいいかな
printf '470230\n470290\n' |
while read -r n
do
echo "$n" | grep -o . | sort -n | tr -d '\n'; echo
done
862:デフォルトの名無しさん
17/03/06 19:23:27.89 08XsJPyW.net
>>841
だからブーメランとかそういうの関係ないから死ねって言ってんだろカス
死ね
863:デフォルトの名無しさん
17/03/06 19:24:30.15 08XsJPyW.net
>>845
粘着が10年位延命しても何もすごくねえよ
突っかかってきたぶちころすぞ雑魚死ね>>841
864:デフォルトの名無しさん
17/03/06 19:26:33.18 08XsJPyW.net
>>841
ブーメランとかじゃなくて死ねって言ってんだから死ねボケ
865:デフォルトの名無しさん
17/03/07 08:17:48.93 6Hf5Xh2e.net
お疲れ様でした
866:デフォルトの名無しさん
17/03/09 21:48:39.65 0T9qj2kA.net
連想配列で
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
867:デフォルトの名無しさん
17/03/10 00:18:57.87 +B1nKlhG.net
既に否定されているがgawk4がもし使えたら
awk '{ORS="";PROCINFO["sorted_in"]="@val_num_asc";x=split($0,a,"");for (i in a)print a[i];print "\n"}'
868:デフォルトの名無しさん
17/03/10 04:05:38.25 wGo6zQ56.net
最近の gawk ならインクルードファイルが用意されてて join とか使えたり
gawk -vFS= -vOFS= -i join.awk '{split($0,a,"");asort(a);print join(a,1,length(a),SUBSEP)}'
869:デフォルトの名無しさん
17/04/04 22:35:43.00 9/WMFGSO.net
# gawk4の読込みタイムアウト機能、けっこう便利そう・・・だけどWindowsはCygwin版じゃないと使えない。残念無念。
BEGIN{
PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 180000
print "3分間待ってやる"
getline t < "/dev/stdin"
if (t=="バルス") {
print "ああ…ああ…目があぁぁぁぁぁ~!"
}
else {
print "時間だ!答えを訊こう!"
}
}
870:デフォルトの名無しさん
17/09/16 00:02:08.63 lO9EtkAG.net
自作の読込みパーサextensionでgz形式のファイルを食えるようにしてみたけど
パーサは一度にひとつしかロードできない設計らしく(ソースでそうなってた)
同じ読込みパーサ形式のxmlライブラリとは併用できなかった
ちょっと使いにくいなあ・・・
871:デフォルトの名無しさん
17/10/09 16:41:58.59 7/rU/a8H.net
4.2.0Betaあげ
872:デフォルトの名無しさん
17/10/16 14:34:21.07 tJ1aGDYb.net
ファイルの終端関係の謎のエラーに直面
「何で行末が欠ける?分からん、全然分からんぞ!」
と悶えていたら、
いつの間にかvimの設定が変になっていて、
書いたファイルがデフォで行末に\rが来る
ようになっていた。
brew でインストールvimインストールしたとき
妙な設定になったのか?
いやねawkのスクリプトで、
空フィールドが\rになったりとか
macOSなのに変だなあと思っていたのだが…
システム外vim使うときは要注意か。
873:デフォルトの名無しさん
17/10/16 14:41:37.20 tJ1aGDYb.net
うぉーっ、林檎のnumbersで書き出したCSVファイルが
DOS改行になっとる…罠だ
874:デフォルトの名無しさん
17/10/22 23:24:45.88 /qEHJ0vm.net
お疲れ様でした
875:デフォルトの名無しさん
17/10/22 23:26:23.47 /qEHJ0vm.net
876:href="../test/read.cgi/tech/1172242542/755" rel="noopener noreferrer" target="_blank">>>755 普段話題なく3年も続こうがべつにすごくないね
877:デフォルトの名無しさん
17/12/09 10:00:30.84 /kecouyU.net
BEGIN{for(i=1;i<=10000000;i++){printf "%08d", i > "test" } close("test)} の実行にかかる時間を
4.1.4と4.2.0で比較すると、4.2.0のほうが倍近く速くなってるね
fwriteのロックがどうたらの影響なんだろうけど
878:デフォルトの名無しさん
17/12/12 21:01:15.07 zxiueT/o.net
懐かしいなぁ。
AWKは自由に現実的な限度はあるけど、書いてて楽しい言語だった。
879:デフォルトの名無しさん
18/01/08 11:00:30.57 szpKYJOz.net
お疲れ様でした
880:デフォルトの名無しさん
18/01/12 00:18:25.22 8Bbkgawk.net
IDがgawkなので来ました
881:デフォルトの名無しさん
18/01/17 10:09:56.59 MoHAEd1l.net
AWKって基本的にUnicodeには対応してるんだよね。
GNUにしろBSDにしろ。
882:デフォルトの名無しさん
18/01/17 17:52:56.47 MoHAEd1l.net
置換函数の第二仮引数に[バックスペース][置換対象の文字列]みたいにしたい時は
gsub(/foo/, "\\\\&", $n)
ってしないといけないんだね。
gsub(/foo/, "\\bar", $n)
が foo -> \bar だったんで foo -> \foo は
gsub(/foo/, "\\&", $n)
でいいと思って半時程嵌った。
883:デフォルトの名無しさん
18/01/18 07:25:24.80 eRgrS92p.net
>>863
それ勧告に従っただけだと思うが。
URLリンク(www.ietf.org)
884:デフォルトの名無しさん
18/03/09 13:30:21.59 Yd19z7Tx.net
ある行に 20 と 34 とはいってる
この行ごと除外したいけど・・・
885:デフォルトの名無しさん
18/03/09 14:33:06.31 X3i0O3oy.net
grep -v ' 20 と 34 '
886:デフォルトの名無しさん
18/03/09 21:38:00.87 3i0y1Him.net
こうかな
gawk "$0!~/20|34/{print}"
887:デフォルトの名無しさん
18/03/09 23:45:36.30 Ejthnyow.net
AWK プログラムの基本構造となっている「パターンとアクションの対」のうち、
アクションが省略されている場合は入力行がそのまま出力される。
またパターンが単一の正規表現である場合は、その正規表現と $0 との照合が行われる。
gawk '!/20と34/'
gawk '!/20|34/'
888:デフォルトの名無しさん
18/03/10 21:39:17.88 NqpdHf3N.net
こぴぺしてやってみたけど 両方消えちゃうんだよね
20 と 34があった場合 出力しない
片方でもあれば 出力する
awk '!/01 / && !/03 /' これも両方消えてる・・
889:なんか日本語がおかしいな。
18/03/11 06:07:55.06 rsmr5+n0.net
>>877
「20 と 34 を両方含む時だけ出力しない。片方だけの場合は出力する。」
そう言いたいのか?
gawk '!(/20/&&/34/)'
890:デフォルトの名無しさん
18/03/11 10:58:35.24 tN+YLJlR.net
ありがとう
()はきがつかなかった・・
891:デフォルトの名無しさん
18/05/23 20:10:48.40 Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
0VDE5
892:デフォルトの名無しさん
18/06/08 22:00:41.48 W8HYHVfd.net
split関数より$0へ代入したほうが速いage
893:デフォルトの名無しさん
18/06/27 16:43:15.93 tzYH0Nnw/
そんなわけないw
894:デフォルトの名無しさん
18/07/04 22:29:02.55 gFgZc5FG.net
02P
895:デフォルトの名無しさん
18/07/05 16:52:56.22 AeL6VB/V.net
0VDE5
896:デフォルトの名無しさん
18/09/11 09:26:39.50 196Ukd9B.net
シェルスクリプト書いててどうしようもないときだけ使ってる
897:デフォルトの名無しさん
18/12/02 13:44:27.64 jISJOvCb.net
AWKって重いと勝手に思ってたけど下手にシェルで制御構文作るより早いね
尤もWSLでやってるのでforkの時間とかそういう問題かもしれないが。
898:デフォルトの名無しさん
18/12/02 14:22:41.55 Bx+z5yQP.net
>>886
重いと言ってもC比だからな。
今時の超大富豪言語PythonやRubyとなら同程度でもおかしくはない。
Cygwinのshが重かったのはご存じの通りforkが原因だ。
気になるならVirtualBox等でlinux環境を構築してその上でテストしてみればいい。
899:デフォルトの名無しさん
18/12/22 02:10:55.36 V7w17XLB.net
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];
}
900:デフォルトの名無しさん
18/12/22 02:57:46.65 kZtDaodg.net
length(arr) でダメなの?
901:デフォルトの名無しさん
18/12/22 20:12:58.98 VPYzPSxJ.net
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
再帰を使う以外に方法があれば、
と思い質問した次第です。
902:デフォルトの名無しさん
18/12/22 21:58:49.47 b6CiPLFa.net
要素を追加するときに
ノード毎に集計値が必要ならそれぞれのノード毎の集計値を保存しとけばいい
そうすれば集計しなおす必要ない
超速いハズ
集計しないからな
903:デフォルトの名無しさん
18/12/22 22:19:10.29 b6CiPLFa.net
こういった集計値がほしいのは分かる
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)
904:デフォルトの名無しさん
18/12/22 23:48:44.15 omdhpVTe.net
>>890
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)で続ける深さを決めて)
いけるように思うが、だったら再帰するのが素直か。
905:デフォルトの名無しさん
18/12/23 00:54:43.50 quoNoaXg.net
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
906:デフォルトの名無しさん
18/12/23 01:05:13.25 quoNoaXg.net
886です。
pとか関係ないパラメータ入れてしまってごめんなさい。
addnode(a, "1-5-1", "connot");
これができません。
a["5"]がスカラーだと言っています。
907:デフォルトの名無しさん
18/12/23 01:15:19.57 quoNoaXg.net
訂正a["1"]["5"]がスカラーの文脈だと言っています。でした
908:デフォルトの名無しさん
18/12/23 01:41:32.84 quoNoaXg.net
886です
for (i in a[1]) print "a[1][" i "] = " a[1][i];
でa[1][5][1]が引っかかっていたようです。
自爆でした。すみません。
909:デフォルトの名無しさん
18/12/23 02:59:04.54 quoNoaXg.net
886です。
親ノード毎?に保存する方法がまだわかりませんが、
明日以降考えます。
みなさん、ご協力ありがとうございました。
910:デフォルトの名無しさん
18/12/23 08:49:07.73 S8HMq/6c.net
gawk4でとにかく速いのが良いならcで拡張関数作るのが良いかと(反則?)
flatten_array_typed関数(4.1.4はflatten_array関数)でawk_flat_array_t構造体のメンバ変数countに要素数が入りますので
要素がAWK_ARRAYなら再帰するように処理すれば出来上がり
APIの使い方は
extension\rwarray.cとか
URLリンク(www.gnu.org)を参考に
gawkだけでやる場合、もし配列の要素数が10万とか100万あるのなら、関数の引数を出来るだけ減らして
関数内からグローバル変数を直接参照したほうが速くなると思います
911:デフォルトの名無しさん
18/12/23 11:20:10.63 qffc/3mK.net
もともと添え字がすべて文字列で保存する仕様というのはしってはいたが
多次元配列はaho[i,j]という形式にして工夫して使えということらしいな
awkで多次元配列なんか使ったことないから知らんかったわ
とういワケでにその形式で多次元配列をlengthでとると>>888で取得したい値になる
当然といえば当然
特定の次元の列だけのとりかたはよくわからん とれんのかコレ
URLリンク(www.kt.rim.or.jp)
Using Numbers to Subscript Arrays
配列について重要なのは、配列の添え字は常に 文字列として扱われるということである。
配列の添え字に数字を使った場合、それは添え字付けに使われる前に 文字列に変換される
URLリンク(www.kt.rim.or.jp)
Multi-dimensional Arrays
多次元配列とは、配列要素の指定を複数の添字の並びによって行う配列である。例え ば二次元の配列は二つの添字を必要とする。
一般的な(awkも含めた大多数の 言語では) 二次元配列の要素に対する参照は grid[x,y]このよ うに行う。 (gridは配列の名前)
セパレータには組み込み変数SUBSEPに格納 されている値が使われる。
912:デフォルトの名無しさん
18/12/23 11:43:46.94 7N3pX2Wi.net
>>900
それを踏まえて>>888で
> gawk4
とわざわざことわっているんじゃないの?
913:デフォルトの名無しさん
18/12/23 22:29:12.74 qffc/3mK.net
まず入力から多次元配列を読込む処理でも作ってみるか
できるのかがよく分からん
コレがすんなりできないとコレ自体が使えるシロモノにならなそうだしな
テストデータは作ってみた
URLリンク(ideone.com)
awkのこの多次元配列についてほかのとこで書いてあるの読んでみると
色々と面倒なことがおきるはのは分かった
特に問題がおきそうなのは一度配列やスカラーで要素を追加すると、
その配列やスカラーを変えて上書きする場合明示的にそれを削除しないと上書きして使えない
きっとなノードを削除するときはその要素゙から辿って一番深いとこから再帰的に削除しないと残骸が残る
cのメモリリークと同じことが起きると推定される
いまいちこの多次元配列に使い道があるのかどうかが分からない
914:デフォルトの名無しさん
18/12/23 23:32:19.00 nM/PpEMV.net
lispが最適
awkは不適
915:デフォルトの名無しさん
18/12/24 01:01:19.83 ivcUrO89.net
URLリンク(ideone.com)
どうにかして動的に配列を構成できないか調べてみたが
やりかたが分からん
>>894の質問してるのが書いた方法で
一旦多次元配列を読む込むようにはしてみた
質問してるのが欲しいといってる要素の数は
結局入力の行数と同じになる
916:デフォルトの名無しさん
18/12/24 01:07:37.50 ivcUrO89.net
URLリンク(ideone.com)
switch分のcaseが1つ少なかったから追加しといた
917:デフォルトの名無しさん
18/12/24 09:11:50.63 PbNokzxn.net
>>902
> きっとなノードを削除するときはその要素゙から辿って一番深いとこから再帰的に削除しないと残骸が残る
delete a は a[1][2] や a[3][4][5] などの子配列含む配列a全体の使用メモリをまとめて "再利用" にまわす
一部の要素を残しておきたい事情が無ければ、delete a[1][2]; delete a[3][4][5]; ... のように子配列を個別に
deleteする必要は無い
たとえば下の(2)は多次元配列bが多次元配列aの使用済みメモリを再利用するので
終了間際のメモリ使用量は(1)(2)どちらも同じになるが、(2)の delete a を消すと倍程度に増える
(1) BEGIN{for(i=1; i<=1000000; i++){a[i%10][i]=i}}
(2) BEGIN{for(i=1; i<=1000000; i++){a[i%10][i]=i} delete a; for(i=1; i<=1000000; i++){b[i%10][i]=i}}
メモリ再利用の仕組みはThe GAWK Manualには書いていないけどAharon Robbinsが↓で回答している
URLリンク(groups.google.com)
918:デフォルトの名無しさん
18/12/24 15:58:51.02 ivcUrO89.net
なるほど
ありがとう
きっと再利用されるから
気にせず放置でいいのか
919:デフォルトの名無しさん
18/12/24 17:27:46.25 8PLVwc4u.net
>>904 886です。ありがとうございます。動的とはこんな感じでしょうか?
一度作って、削除するという変な仕様ですが。
BEGIN {
a[1] = "foo";
a[2][1] = "bar";
a[2][2] = "baz";
a[3] = "qux";
a[4][1][1] = "quux";
a[4][2] = "corge";
for (i = 1; i < 5; i++) {
meta_ar_init(b, i);
clone(b[i], a);
}
}
function meta_ar_init(ar, init_num) {
ar[init_num][1] = "";
delete ar[init_num][1];
}
function clone(lhs, rhs, i) {
for (i in rhs) {
if (isarray(rhs[i])) {
lhs[i][1] = "";
delete lhs[i][1];
clone(lhs[i], rhs[i]);
} else
lhs[i] = rhs[i];
}
}
920:デフォルトの名無しさん
18/12/27 20:01:48.39 pQqvXPza.net
よく分からんが
例えばそれで>>904の入力データなんかを読み込めたりするのか
>>905のswitchだと事前に何次元かわかってないと読み込めない
何次元になるか不明な入力データの場合
どうやれば格納できるかよくわからんんかった
921:デフォルトの名無しさん
18/12/27 22:46:53.38 X7jxTwwp.net
>>908の「一度作って、削除する」というのは
URLリンク(www.gnu.org)
ここの一番下のsplitがエラー吐く例の回避策で、配列の要素を最初から配列扱いすることはできないから
予め次階層にダミー要素をぶら下げておき、本命を格納し終えたらダミーは消すって意味かな
自分で書いたらこんなんなったけど、いちおう何次元でも格納できそう
URLリンク(ideone.com)
922:デフォルトの名無しさん
18/12/30 03:28:21.38 5ft+KBa+B
すごいけど配列の値が書いてないので
BEGIN {
array_entry(a, "1-2-3", 48)
array_entry(a, "1-2-4-6", 667)
array_entry(a, "3-1", 0)
array_entry(a, "4", 6)
array_entry(a, "5-1-2-3-4-5", -128)
process_array(a, "a", "do_print", 0)
}
function array_entry(a, val, ele , step, b, n) {
n = split(val, b, /-/)
if (n == 1) { a[val + 0] = ele; return }
if (step == n - 2) { a[b[step + 1]][b[n]] = ele; return }
a[b[step + 1]]["dummy"];
if (step + 1 < n) {
array_entry(a[b[step + 1]], val, ele, step + 1)
delete a[b[step + 1]]["dummy"]
}
}つづく
923:デフォルトの名無しさん
18/12/30 03:29:15.30 5ft+KBa+B
function do_print(name, element) {
printf("%s = %s\n", name, element);
}
function process_array(arr, name, process, do_arrays, i, new_name) {
for (i in arr) {
new_name = (name "[" i "]");
if (isarray(arr[i])) {
if (do_arrays)
@process(new_name, arr[i]);
process_array(arr[i], new_name, process, do_arrays);
} else
@process(new_name, arr[i]);
}
}
これでいけそう?
924:デフォルトの名無しさん
18/12/31 02:46:41.48 20SukTdNU
ちゃんと書いてみました。
URLリンク(ideone.com)
925:デフォルトの名無しさん
19/01/01 00:00:01.96 7rl7mk2H.net
2019年もawkのお世話になります
926:デフォルトの名無しさん
19/01/02 18:12:37.70 0+aicLseW
すげー
927:デフォルトの名無しさん
19/01/05 08:05:13.61 1ixBisDID
どなたか教えてください
Windows10-32bit,MinGW(msys無し),gawk4.2.1 for win32 bin/src(ezwinports),
Shift_JISの環境で builtin.c を書き換えてビルドしました。
書き換えた内容はprintf/sprintfのマルチバイト文字列整形関連です。
ビルド後、期待通りに動きますが、実行ファイルサイズが4.8MBもあります。
上記のソースディレクトリでcmdを起動して
mingw32-make mingw32
とタイプしました。
出来上がった gawk.exe のファイルサイズは正常なのでしょうか?
また、上記環境ではできませんが configure は必要ですか?
よろしくお願いいたします。
928:デフォルトの名無しさん
19/02/05 18:58:36.44 9Z2hbdGL.net
60くらいの教授が40年くらい前にAWKでアセンブラ作ったとか言ってたんだけど
当時に既にあったということと当時から小規模なコンパイラなら作れるくらい高性能だったことに驚いた
929:デフォルトの名無しさん
19/02/05 19:10:49.73 dIIT7BCG.net
アセンブラをコンパイラとは呼ばないが
930:デフォルトの名無しさん
19/02/06 10:31:17.59 +qagyc5o.net
aho
931:デフォルトの名無しさん
19/02/06 13:09:33.86 j4QdsmCl.net
asort、asortiがよくわからなかったので試した結果
# a
a[5] ="a5"
a[1] ="a1"
a[3] ="a8"
# asort(a,as)
as[1] ="a1"
as[2] ="a5"
as[3] ="a8"
# asorti(a,asi)
asi[1]=1
asi[2]=3
asi[3]=5
なんだそういうことだったのかとわかった
932:デフォルトの名無しさん
19/02/06 17:39:23.37 +3VpeZVh.net
>>917
思わず "assembler by awk" でググって The Amazing Awk Assembler by Henry Spencer を
ダウンロードしちゃったじゃないか。
933:デフォルトの名無しさん
19/02/23 17:41:13.06 Y0E0nwid.net
awkでファイルがあるかどうかの判別は、どのようにしたらよいのでしょうか?
具体的にはBEGINの中で
getline a < "/dev/stdin";
fn = a".txt"
と任意のファイル名を作った後、そのファイルがあるかどうかを確認したいんです。
もしファイルがすでにあったら処理は終了、無ければ以後の処理をそのファイルにリダイレクトする、という感じです。
934:デフォルトの名無しさん
19/02/24 00:16:02.91 Cwr1i6xY.net
if(getline<fn!=-1)exit
とか?
935:デフォルトの名無しさん
19/02/24 11:45:53.93 FuDjIOWV.net
>>923
できました!ありがとうございます!!
936:デフォルトの名無しさん
19/03/21 08:10:09.34 pGDO/F2C.net
答えが出ないなんで?
#!/usr/bin/awk -f
BEGIN{
print game(10, 24);
}
function game(coin,depth, i,j){
if(memo[coin,depth]){
return memo[coin,depth];
}
if(coin == 0){
return 0;
}
if(depth == 0){
return 1;
}
win = game(coin + 1, depth - 1);
lose = game(coin - 1, depth - 1);
memo[coin,depth] = win + lose;
}
937:デフォルトの名無しさん
19/03/21 09:51:18.96 WMaCNtBE.net
最後の memo[coin,depth] = win + lose はそのまま関数の戻り値として
return しなければならないが、それを忘れている。
さらに、正しい答えが返らない原因が 2 点。
関数定義の引数名間違い: i,j → win,lose。
if(depth == 0) と if(coin == 0) の判定を行う順序が逆。
938:デフォルトの名無しさん
19/03/21 14:19:16.55 pGDO/F2C.net
>>926
ありがとうございます。
そっか。returnがいるんですね。
perlだと最後はreturn省略可能だけどawkは省略不可みたい。
あと、引数名も間違っていました。
正しい答え出ました!
939:デフォルトの名無しさん
19/03/21 21:25:33.68 ZeSQsBE1.net
それぐらいの処理は、Ruby で作れ!
940:デフォルトの名無しさん
19/03/21 23:54:47.78 7AyLRSvD.net
オーク英雄物語 ~忖度列伝~
URLリンク(ncode.syosetu.com) 👀
Rock54: Caution(BBR-MD5:0be20a4887bc3d3353f527d3636c44e3)
941:デフォルトの名無しさん
19/04/01 17:01:28.78 nwflCE8J.net
>>928
awkの方がいいときもある
installしなくていい
タスクマネージャでみているとrubyよりメモリを食わない時もある
融通の利く配列が超便利
通信、Hash、sortなど使いまくる時はrubyのほうがいいけど
942:デフォルトの名無しさん
19/04/01 17:12:08.21 Tc5+6fel.net
いや、Perlだ。
理由
俺が慣れてるから。
943:デフォルトの名無しさん
19/04/01 22:48:54.89 0AqZLgzF.net
Perlはまぁ慣れ以外に使う意味はあまり見出せない。
944:デフォルトの名無しさん
19/04/02 04:44:16.86 3dIjgbOm.net
漏れは、Windows 10・WSL・Ubuntu 16.04 だけど、
sudo apt install ruby だけで、Ruby 2.3 が入った
2.4 以降の新しい書き方さえしなければ、動く
Perl, Python は、最初から入っているけど
945:デフォルトの名無しさん
19/04/02 10:00:50.55 USFH8Mum.net
>>933
死ね
946:デフォルトの名無しさん
19/04/02 10:29:57.68 egwP5Lwa.net
Perl脳だとdieなどと言いたがるんかね。
947:デフォルトの名無しさん
19/04/02 12:24:56.71 exqjvsIl.net
Perl die好き
948:デフォルトの名無しさん
19/04/02 12:34:58.56 m0agfZtU.net
w
949:デフォルトの名無しさん
19/04/17 15:16:55.69 bLXqfCqA.net
GNU AWK 5.0がリリース。8年ぶりのメジャーバージョンアップ。正規表現ライブラリが
GLIBCからGNULIBへ移行、名前空間が実装 2019年4月17日
URLリンク(www.publickey1.jp)
UnixやLinuxにおいてsedやgrepなどと並んでよく知られているツールの1つがawk(オーク)
です。このawkのGNUプロジェクトによる実装の最新版「GNU AWK 5.0」(gawk 5.0)の
リリースが発表されました。
2011年にリリースされたGNU AWK 4.0から8年ぶり、直前のバージョンでとして2017年10月に
リリースされた4.2.0からは約1年半ぶりとなります。
AWKはいわゆるスクリプティング言語の一種。変数や関数、制御文など基本的な構文を備え、
テキストファイルを効率的に処理できるのが特徴です。
GNU AWK 5.0の新機能としては、printfの%aおよび%Aの書式がPOSIX標準に準拠したこと、
正規表現のルーチンが、長年にわたってメンテナンスされてきたGLIBCからGNULIBに
置き換わったことなど。
また、識別子に非英語文字を使うためのドキュメント化されていなかったオプションなどは
削除され、ソースコードはC99環境が想定されるようになっています。
そして新たに名前空間が実装されています(詳細はマニュアルを参照とのこと)。
950:デフォルトの名無しさん
19/04/17 17:19:50.38 fsOEjVgH.net
sedとawkで簡単にできることを
他の方法でやってるアホを見ると優越感に浸れるよな
951:デフォルトの名無しさん
19/04/17 21:27:37.50 Cw3S472M.net
5.0.0じゃなくて4.3.0でいいじゃんって更新内容だな・・・
952:デフォルトの名無しさん
19/04/17 23:57:17.65 t5VcExa0.net
今時っぽく定期的にメジャーバージョンアップしていく作戦?
そろそろAWKCARD印刷してみようかな…
953:デフォルトの名無しさん
19/04/18 00:37:48.90 y8/6ebia.net
>>939
簡単な変換なのにWindowsとかでいきなりExcelでやろうとしちゃう人を見るとそこまでせんでも良いじゃないかとは思ってしまうな。
まあ日頃Windowsで事務処理的な事している人からすればそれ以上最良で分かりやすい環境はないんだろうけどな。
なんでもかんでもそれでやろうとして余計に分かりづらく複雑になってうまく行かずにハマっているのを見ると哀れに感じる。
954:デフォルトの名無しさん
19/06/01 01:13:44.70 QInzSHhj.net
こういう記法ができることを知らず、気づくのに数年かかった
正規表現比較のifで変数を使える、gsubなどで変数を使える
txt=”aabbcdefg1234”
x=”^” substr{$0,1,1} ”+”
if {txt ~ x}print ”ok”
y=substr{$0,1,1}
z=substr{$0,2,1}
gsub{y,z,$0}
(半角だと書き込みエラーになるので全角に変換)
955:デフォルトの名無しさん
19/06/01 01:15:01.39 QInzSHhj.net
>>943
あれ変換おかしい
{} → ()
956:デフォルトの名無しさん
19/06/01 05:25:56.80 cEFw76xP.net
ふふふ知ってた。
957:デフォルトの名無しさん
19/06/05 00:27:37.11 /Z5C9xDG.net
The AWK Programming Language (の邦訳本) から入ったので知ってはいるけど、
エスケープ文字を考慮してコードを書くのが面倒なので極力避けてるな。
文字列が正規表現へ「型変換」されるときの振舞いについて、本には一応書いてある。
958:デフォルトの名無しさん
19/06/08 18:14:03.76 QbmZ5eQJn
user's guide ~Regular Expressions
・Using Dynamic Regexps
結構前からある。
内部的には文字列定数を正規表現として使うために
2回目のスキャンが必要らしい。
959:デフォルトの名無しさん
19/06/11 21:06:31.25 +TF2B1JOC
どうせ廃れるぜ。この言語はよ。あばよ
960:デフォルトの名無しさん
19/06/12 18:34:22.16 yp7o1TZla
AWK / GAWKにて
UTF-8の文字列表示長さって、どうやって求めるのですか?
たとえば、 str="abcdeあいうえお"
半角を 1 とすると str の表示長さは 15
また、キャラクタ数と表示長さを1つスクリプトで
併用したいときはどうすればよいのでしょうか?
分かる方、教えてください。よろしくお願いいたします。
961:デフォルトの名無しさん
19/06/12 18:49:25.69 KWGtdn6vZ
私はこうしてます。
URLリンク(mfi.sub.jp)
962:デフォルトの名無しさん
19/06/12 19:07:09.50 kkOQizBgZ
>>950
ありがとございます。
助かります。
963:デフォルトの名無しさん
19/06/12 22:16:17.50 wOmIo+3+t
ごめんこっちの方が良かった。
UTF-8なので使い方は違うけど
ASCII/128個と半角カナ/63個以外は、長さ2で計算するので
表示長さだと思ってください。
URLリンク(ideone.com)
964:952
19/06/12 22:41:15.99 CfhwF05wL
忘れてました。
ideoneのstdin 文字化けしてるわけじゃないから。
ランダムに文字打ち出してるだけです。
965:デフォルトの名無しさん
19/06/13 13:49:33.22 FlIZ7NjL1
こちらもどうぞ
bsubstr(string, start, length)
指定位置(表示長さ単位)から指定表示長さの文字列を切り出す関数
文字化けする箇所はスペース充填
Shift_JISでもUTF-8でも可
URLリンク(ideone.com)
966:デフォルトの名無しさん
19/06/13 18:18:48.64 +trsIn9cI
よろしければこちらもどうぞ。
sformat(fw, prec, string)
sprintf("%*.*s", fw, prec, string)の替わりに
さっき作ったからバグがあるかもしれません。
URLリンク(ideone.com)
967:デフォルトの名無しさん
19/06/14 02:38:34.74 8YLuNO2w7
眠い、帰ってきて見直したらダメダメでした。
sformat()改良しました。
見てくれてるかな
URLリンク(ideone.com)
968:デフォルトの名無しさん
19/06/14 14:13:28.99 rib6nibVS
bsubstr()も見直した。
やっぱりダメダメだった。
URLリンク(ideone.com)
969:デフォルトの名無しさん
19/06/19 04:52:26.36 tVNS+22r.net
【出資】松本卓朗 人工知能詐欺【注意】
スレリンク(rikei板)
970:デフォルトの名無しさん
19/06/30 05:07:43.82 1ALBmyOB.net
AWKが巨大なテキストファイルを処理できないみたいな話を知ってる方いらしゃいますか。
大体1.4GiBくらいのファイルをAWKで編集しようとすると「ファイルの空きがない」みたいなエラーが出るので。
971:デフォルトの名無しさん
19/06/30 12:11:04.21 QU2Ls1X6.net
UNIXというかまともなPIPE実装されてるOSならそんなことはないが
WINDOWSとかいうアホなOSだと出るだろうね
972:デフォルトの名無しさん
19/06/30 12:19:57.44 pDzbN/vc.net
「ファイルの空きがない」っていうメッセージは "No space left on device" の事?
973:デフォルトの名無しさん
19/06/30 15:28:11.21 o/HVRPYj.net
>>960
コマンドラインでリダイレクト使ってればそうかも知れんが
スクリプト内で出力先を指定してたらわからんぞー
974:デフォルトの名無しさん
19/06/30 21:02:48.49 1ALBmyOB.net
>>960
なるほど。
975:デフォルトの名無しさん
19/06/30 21:56:09.12 HbSturrb.net
>>959
改行コードの違いにより全体が長い一行と認識されてしまい・・・なんて事はないか?
あ、でも、ファイルの空きがないってのは出力先の空き容量が足りないってことかな?
976:デフォルトの名無しさん
19/07/01 01:34:15.60 2smzn43h.net
>>961
そうです。
でもファイルシステムとしては全く余裕がある状態なんです。
977:デフォルトの名無しさん
19/07/01 02:30:15.69 jjSXuURg.net
なんだろうね。作業用ファイルが作られるパーティションの空きが足りないとかかな?
978:デフォルトの名無しさん
19/07/01 02:35:44.08 KfVaWYci.net
64bit版か32bit版かで違わないか
1.4GBは入力で出力も同じなのかはるかに小さいのか
出力が速すぎることはないのか、ゆっくり出力するようにしたらどうか
979:947
19/07/01 07:19:02.17 2smzn43h.net
>>966
すいません。これが原因でした。
AWKは全く悪くありませんでした。ご迷惑&&スレ汚し、大変失礼しました……。
980:デフォルトの名無しさん
19/07/01 07:38:04.28 O1pDJEnN.net
Ruby で
981:も、File.read なら、ファイルの内容を、メモリ内にすべて読み込んでしまうから、 500MB 以上なら、読み込めずにエラーになるだろう File.foreach なら、メモリ内に、1行ずつ読み込んでは捨てるから、大きいファイルでも大丈夫 まあ、RubyVM 起動時に、そのアプリが使うメモリのサイズを、指定できると思うけど。 JavaVM には、そういうオプションがある
982:デフォルトの名無しさん
19/07/02 21:28:41.07 Stz7guhB.net
awkで dateを使ったのですが、秒数が更新されず悩んでます。仕様とかそういう情報ご存知のかた教えて
頂けないでしょうか
■ コード
BEGIN {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +\"%Y/%m/%d %I:%M:%S\" " | getline datTmp
print "Start:" datTmp
system("sleep 2")
}
}
END {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +%I:%M:%S" | getline datTmp1
print "End:" datTmp1
system("sleep 2")
}
}
■ 結果
Start:2019/07/02 09:18:36
Start:2019/07/02 09:18:36
Start:2019/07/02 09:18:36
End:09:18:42
End:09:18:42
End:09:18:42
■ 疑問
Start, End 共に最初の 1 回目のみ秒数が取れているようで、2回目からは2秒後のはずなのに、秒数が変わっていない orz..
983:952
19/07/02 21:47:38.82 Stz7guhB.net
お騒がせしました。自己解決しました。
URLリンク(stackoverflow.com)
closeを使う必要が有ったようです。
■ コード
BEGIN {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +\"%Y/%m/%d %I:%M:%S\" " | getline datTmp
print "Start:" datTmp
system("sleep 2")
close("date +\"%Y/%m/%d %I:%M:%S\" ")
}
}
END {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +%I:%M:%S" | getline datTmp2
print "End:" datTmp2
system("sleep 2")
close("date +%I:%M:%S")
}
}
■ 結果
Start:2019/07/02 09:44:49
Start:2019/07/02 09:44:51
Start:2019/07/02 09:44:53
End:09:44:55
End:09:44:57
End:09:44:59
984:デフォルトの名無しさん
19/07/03 06:22:07.32 IYY9eTuR.net
gawkなら時間関数群あるんじゃ。
985:デフォルトの名無しさん
19/07/04 01:05:04.08 vxwYTSOB.net
ここいいね。Web上でawkの実行とその結果が見れるサービス。
URLリンク(www.tutorialspoint.com)
986:デフォルトの名無しさん
19/07/05 19:29:13.12 p9vBdDGq.net
fi
、Jj
Й
/⌒ヽ
l_ 0..0
}{ l冊
-=-v=-
}{ 彡ミノ{
}{ 非 }{
匁OTO)匁
}{ }{
}{ }{
及 及
987:デフォルトの名無しさん
19/08/05 11:42:29.38 N86fIT/u.net
Windows10 のコマンドプロンプトで awk を使いたいです。
vector で検索するといろいろでてくるのですが、
これがお勧めっていうのありますでしょうか。
日本語も扱えるのがいいです。
よろしくお願いします。
988:デフォルトの名無しさん
19/08/05 11:44:36.72 MNXFY7cg.net
Windows 10なら、標準機能のWSL(+Ubuntu)をインストールするのが一般的
vectorとかもうあんなのいらない
989:デフォルトの名無しさん
19/08/05 12:04:58.85 N86fIT/u.net
WSLって使ったことなかったんですけど、
ググってみたらもう Win で Linux が標準で使えるんですね。
これなら cygwin とかも、もういらないのかな。
情報どうもです。
990:デフォルトの名無しさん
19/08/05 12:06:14.91 MNXFY7cg.net
cygwinもいらない。遅いし互換性低いし
991:デフォルトの名無しさん
19/08/05 12:06:57.54 NOA3rn3w.net
WSL って pro だけ?
home だったら付いてない?
msys とか入れれば解決するけど
992:デフォルトの名無しさん
19/08/05 12:18:30.48 N86fIT/u.net
マイクロソフトもビルゲイツがいなくなって
多少は良い事もするようになったかな。
993:デフォルトの名無しさん
19/08/05 12:33:33.70 LhsszH09.net
>>980
いや、まだ足りない。何でもかんでもWindowsの上で動くようにしているだけだしね。すると何を動かすにしてもWindowsのライセンス料が掛かる。
まあ仕方のないことではあるがな。
994:デフォルトの名無しさん
19/08/05 12:42:57.45 MNXFY7cg.net
WSLはhomeでも使える。WSL2も使えるようにすると発表があった。
995:デフォルトの名無しさん
19/08/05 12:59:49.23 MNXFY7cg.net
>>981
> 何でもかんでもWindowsの上で動くようにしているだけだしね。すると何を動かすにしてもWindowsのライセンス料が掛かる。
それがLinuxでも動くようになり、Windowsのライセンス料もかからなくなってきてるから
最近のMSの評判が抜群に上がってるんだろ
996:デフォルトの名無しさん
19/08/05 15:30:49.20 VYzH3PNA.net
>>980
windows育ちでないunix系を知っている今のCEOに変わってから変化し始めた
ダメな旧MS文化からunix系やandroid系に転換をはかっている
ダメだったのは前CEOバルマー
997:デフォルトの名無しさん
19/08/05 17:45:26.88 QFC6lZK5.net
いっそのこと UNIX のカーネルに Windows のシェルを
被せてもらいたいですね。
Mac はもうそうなってるし。
998:デフォルトの名無しさん
19/08/05 17:59:46.21 MNXFY7cg.net
そのわりに、MacってUNIXを全然活かせてないよな?
forkは遅いし、仮想マシン使ったほうがMacよりも速いし。
999:デフォルトの名無しさん
19/08/05 18:09:58.23 MNXFY7cg.net
まあ、AppleはUNIXを真似ることしかできなかったわけで
UNIXと双璧をなす独自OSを作り上げたMSと同じことをしろというのも酷な話だが、
UNIX/Linuxを取り込むなら、WSLと同じ仕組みで十分な気がする。
あとAppleが運が悪かったのは、Linuxがここまで普及すると予測できなかったことかな
BSD系を採用しちゃったので、Linuxとコマンド体系が微妙に変わってしまった。
標準でUnixコマンドが搭載されてるにも関わらず、サードパーティのHomebrewを使って
Linux互換(GNU版)のコマンドに置き換える人も多いし。
1000:デフォルトの名無しさん
19/08/05 20:09:15.04 oBMYP5f0.net
> UNIXと双璧をなす独自OSを作り上げたMS
ゴミをでっち上げ、OSとかよく解らない池沼層に売っただけ。
1001:デフォルトの名無しさん
19/08/05 20:51:07.86 LhsszH09.net
MSはOSというよりはUIを作った感じだな。
1002:デフォルトの名無しさん
19/08/05 21:05:19.12 MNXFY7cg.net
>>988
嫉妬すんなよw 事実は受け入れようぜw
1003:デフォルトの名無しさん
19/08/05 21:12:10.12 O6CFE/yb.net
マクドナルドのハンバーガー並に普及した
1004:デフォルトの名無しさん
19/08/05 22:10:04.48 o5dspg/Y.net
macOSの前身のNEXTSTEPは技術的には絶賛されてた
macOSは中身ほぼNEXTSTEPで見た目をモダンにしただけだ
1005:デフォルトの名無しさん
19/08/06 14:52:58.06 SvihPrAV.net
マルチユーザーマルチスレッドωωω
1006:デフォルトの名無しさん
19/08/06 17:42:44.33 9obbnMlM.net
> macOSの前身のNEXTSTEPは技術的には絶賛されてた
でもUNIXの割にforkが遅いんだよな
cygwin使ってるのか?って思っちゃうぐらい。
1007:デフォルトの名無しさん
19/08/06 20:48:47.73 ePqW8mte.net
スレッドも遅いの?
1008:デフォルトの名無しさん
19/08/07 00:04:17.07 NEAc+E18.net
>>994
forkが速くて称賛されてた訳じゃないからな…
ちなみにforkの速度は今時そんなに重要じゃないぞ
もしそれで困ってるならスレッドを使うとか事前にプロセスを起動して置くなりすればいい
1009:デフォルトの名無しさん
19/08/07 00:33:23.13 WK8NJ3/V.net
でもそうするとWSLで十分じゃね?という話になる
1010:デフォルトの名無しさん
19/08/07 01:24:29.79 NRK0ob+d.net
新手のスレ埋め立てかw
1011:デフォルトの名無しさん
19/08/07 04:38:27.64 /UJIAec/.net
>>987
そんなこと気にする人ってどれくらい居るんだろう
CPUですら68、PowerPC、x86と変えてきて
OSは独自、BSDと来たもんだ
多くの人は中身を気にせず使ってるのに
自分は元マカーだけど今は1台も持ってない
でもファッションでMacBookいいカナと思うよ
仕事はITのエンジニアで商用UNIX使ってるけど
コマンドなんてどうでもいいわ
好きなところにログインすれば言いだけなんだから
1012:デフォルトの名無しさん
19/08/08 01:24:30.39 X/CTiqlR.net
| awk -F: '! /BINARY/ {print $1}'\
正規表現無しの簡潔な部分はperl -lane より短くて最高
1013:デフォルトの名無しさん
20/08/02 11:03:40.06 mglN/rTr.net
>>1000
短かいのが正義!とは思わないけど、
perlと違ってSUSで定義されてるのがありがたいね。
1014:デフォルトの名無しさん
20/08/02 17:25:58.24 IlYSPDQE.net
ファッションでというと、写真撮影しているオシャレな感じのスタジオの受け付けにマックがあったのだが画面を見るとWindowsだったというのを見たことがあるな。
エミュでWindows動かしてそこで業務用のソフト動かして受け付け業務に使っているということだが、客から見るとディスプレイの裏側が主に見えるのでAppleマークが見えると。
1015:デフォルトの名無しさん
20/08/02 19:24:52.35 mglN/rTr.net
>>1002
誤爆?
1016:デフォルトの名無しさん
20/08/03 02:35:57.38 iGTWfWuc.net
>>1003
>>999
1017:デフォルトの名無しさん
20/08/03 09:51:55.82 3aFKjSal.net
Aho
1018:デフォルトの名無しさん
20/08/03 10:16:40.93 ZKD4yCvc.net
AWmae no Kachan debeso
1019:デフォルトの名無しさん
20/08/03 20:08:52.49 iGTWfWuc.net
awk の a は本当に Aho の略(人名)
1020:デフォルトの名無しさん
20/08/08 20:17:17.30 02OvZPQeD
Windowsのコマンドプロンプトでgawk使ってますが、
BEGIN{
print ("三" ~ /[亜-黑]/) ? "matched" : "unmatched"
print ("浦" ~ /[亜-黑]/) ? "matched" : "unmatched"
}
漢字かどうかの判断で、浦はマッチするけど、三がマッチしません。。(井や上もマッチしない)
SHIFT JISです。Klabaster 4.1.4でもezwinports 5.1.0でも同じ結果でした。どなたかヒントもらえると嬉しいです。
1021:デフォルトの名無しさん
20/08/10 14:00:21.38 l5zwQhnu.net
>>1000 >>1001
何事もないように書いてるけど実は1年空いてる
1022:デフォルトの名無しさん
20/08/10 14:01:04.64 l5zwQhnu.net
即レスも大概だが亀レスも大概やな!
1023:デフォルトの名無しさん
20/08/10 22:16:10.09 DZgybkpe.net
AWesome Kame res
1024:デフォルトの名無しさん
20/08/13 10:26:07.54 uwSNr/lm.net
真のawkerは多くを語らない。
awkを語らない…ナンチャッテ!
1025:デフォルトの名無しさん
20/08/13 16:09:43.86 GqR68DDy.net
は?
1026:デフォルトの名無しさん
20/08/14 13:41:25.37 H4TUvcZb.net
【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
1027:デフォルトの名無しさん
20/08/14 15:50:04.19 XKPWE/tl.net
URLリンク(www.manabu-oshieru.com)
1028:デフォルトの名無しさん
20/09/14 11:09:07.94 c+iGp9gS.net
bashで小数点の比較をする方法にbcを使うという意見が多かった
けどawkの方がわかりやすいと思う
condition()
{
awk 'BEGIN { exit ! ('"$*"') }'
}
x=5.6; y=42.1
if condition "$x < $y"; then
echo true
else
echo false
fi
1029:デフォルトの名無しさん
20/09/14 11:15:45.20 S/jhW9z+.net
bcはインストールされてないことが時々あるんで使わないね
まあその点はawkの方がマシだろう
1030:デフォルトの名無しさん
20/09/14 12:03:30.66 gMM3Z1ji.net
梅
1031:デフォルトの名無しさん
20/09/14 12:08:39.52 H3Bos02D.net
Aho Weinberger Kernighan
1032:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 4951日 12時間 12分 57秒
1033:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています