腐っても鯛? 騏も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語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
285デフォルトの名無しさん
2009/06/26(金) 11:29:46286デフォルトの名無しさん
2009/06/30(火) 01:27:46 fold とか?
287デフォルトの名無しさん
2009/07/13(月) 09:52:52 正規表現で空白で区切られたテキストをHTMLでいうtableにしたいです。
例)
10進 2進 8進
000 000 000
001 001 001
002 010 002
003 011 003
↓↓↓↓↓↓↓
<table>
<tr><th>10進</th> <th>2進</th> <th>8進</th></tr>
<tr><td>000</td> <td>000</td> <td>000</td></tr>
<tr><td>001</td> <td>001</td> <td>001</td></tr>
<tr><td>002</td> <td>010</td> <td>002</td></tr>
<tr><td>003</td> <td>011</td> <td>003</td></tr>
</table>
例)
10進 2進 8進
000 000 000
001 001 001
002 010 002
003 011 003
↓↓↓↓↓↓↓
<table>
<tr><th>10進</th> <th>2進</th> <th>8進</th></tr>
<tr><td>000</td> <td>000</td> <td>000</td></tr>
<tr><td>001</td> <td>001</td> <td>001</td></tr>
<tr><td>002</td> <td>010</td> <td>002</td></tr>
<tr><td>003</td> <td>011</td> <td>003</td></tr>
</table>
288デフォルトの名無しさん
2009/07/13(月) 12:07:49289デフォルトの名無しさん
2009/07/13(月) 16:12:21 正規表現使ってタグを切り替えたいのかな?
290hogehoge
2009/07/17(金) 16:37:34291デフォルトの名無しさん
2009/07/17(金) 18:35:54 今までawk '{print $3}'程度しか使って無かったが、最近これを読んでawkを見直した。
http://www.eecs.harvard.edu/cs152/lectures/CS152-Lecture_14-Kernighan.pdf
http://www.eecs.harvard.edu/cs152/lectures/CS152-Lecture_14-Kernighan.pdf
292デフォルトの名無しさん
2009/07/26(日) 15:10:31 ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
ここのgawkで>>17のサンプルを試したが動かなかった。
gawk: test.awk:4: 致命的: 入出力用の双方向ソケット `/inet/tcp/0/www.yahoo.com/80' が開けません (No such file or directory)。
ここのgawkで>>17のサンプルを試したが動かなかった。
gawk: test.awk:4: 致命的: 入出力用の双方向ソケット `/inet/tcp/0/www.yahoo.com/80' が開けません (No such file or directory)。
293hogehoge
2009/07/27(月) 11:13:15 それはそこのサイトの人に言えよ
294デフォルトの名無しさん
2009/07/28(火) 00:11:42 いつのまにかgawk 3.1.7が出てた。
295デフォルトの名無しさん
2009/07/30(木) 11:45:58 Ruby 勉強中だけど AWK のほうが楽しいぜ(´・ω・`)
296デフォルトの名無しさん
2009/08/06(木) 10:22:37 7月7日→[[7月7日|07月07日]]
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月3日]]
12月16日→[[12月16日|12月16日]]
と置き換えたいです。
perlならわりと簡単なのですが、awkで簡単にいきますか?
自分がawkのことを勉強不足だからかもしれませんけど…。
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月3日]]
12月16日→[[12月16日|12月16日]]
と置き換えたいです。
perlならわりと簡単なのですが、awkで簡単にいきますか?
自分がawkのことを勉強不足だからかもしれませんけど…。
297デフォルトの名無しさん
2009/08/06(木) 10:24:13 ↑間違いました。
7月7日→[[7月7日|07月07日]]
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月03日]]
12月16日→[[12月16日|12月16日]]
7月7日→[[7月7日|07月07日]]
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月03日]]
12月16日→[[12月16日|12月16日]]
298デフォルトの名無しさん
2009/08/06(木) 11:03:17 例がよくわからないんだけど,数字1桁の部分を2桁にしたいってこと?
299デフォルトの名無しさん
2009/08/06(木) 11:13:12 {
gsub(/月|日/," ");
printf("%02d月%02d日\n",$1,$2);
}
とか.
フィールドセパレータがデフォルト(半角スペース)の場合ね.
gsub(/月|日/," ");
printf("%02d月%02d日\n",$1,$2);
}
とか.
フィールドセパレータがデフォルト(半角スペース)の場合ね.
300デフォルトの名無しさん
2009/08/06(木) 11:15:10 >296
Perlで簡単に書けるなら、一旦Perlコード晒してくれるか?
どうも仕様がよく解らんのだ…
Perlで簡単に書けるなら、一旦Perlコード晒してくれるか?
どうも仕様がよく解らんのだ…
301デフォルトの名無しさん
2009/08/06(木) 11:54:28 print gensub(/0([0-9])([0-9])/, "\\1\\2", "g", gensub(/([0-9]+)/, "0\\1", "g",
$1))
我ながら汚ねぇなぁ(´・ω・`)
>>299の方がいいな
$1))
我ながら汚ねぇなぁ(´・ω・`)
>>299の方がいいな
302デフォルトの名無しさん
2009/08/06(木) 12:27:22 >>298,300 置換しないで変えたいとこだけ出力するならこういう意味です。
#!/usr/bin/perl
while(1){
$line = <STDIN>;
if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/){
$month = $1; $day = $2;
if($month >= 10) {
if($day >=10){
print "$& -> [[$month月$day日]]";
}
else {
print "$& -> [[$month月$day日|$month月0$day]]";
}
}
else{
if($day >=10){
print "$& -> [[$month月$day日|0$month月$day]]";
}
else{
print "$& -> [[$month月$day日|0$month月0$day]]";
}
}
}
}
1月1日 - ユーロ導入10周年。
1月1日 -> [[1月1日|01月01]]
12月31日 - ニューヨークのマンハッタン橋開通100周年。
12月31日 -> [[12月31日]]
8月21日 - ハワイ州州制50周年。
8月21日 -> [[8月21日|08月21]]
10月1日 - パラオ独立15周年。
10月1日 -> [[10月1日|10月01]]
#!/usr/bin/perl
while(1){
$line = <STDIN>;
if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/){
$month = $1; $day = $2;
if($month >= 10) {
if($day >=10){
print "$& -> [[$month月$day日]]";
}
else {
print "$& -> [[$month月$day日|$month月0$day]]";
}
}
else{
if($day >=10){
print "$& -> [[$month月$day日|0$month月$day]]";
}
else{
print "$& -> [[$month月$day日|0$month月0$day]]";
}
}
}
}
1月1日 - ユーロ導入10周年。
1月1日 -> [[1月1日|01月01]]
12月31日 - ニューヨークのマンハッタン橋開通100周年。
12月31日 -> [[12月31日]]
8月21日 - ハワイ州州制50周年。
8月21日 -> [[8月21日|08月21]]
10月1日 - パラオ独立15周年。
10月1日 -> [[10月1日|10月01]]
303デフォルトの名無しさん
2009/08/06(木) 14:16:23 なんか素直にPerlでやったほうが楽そうだなあ、それ。
ちなみに、そのコードじゃ無限ループするぞ。
#!/usr/bin/perl
while($line = <STDIN>) {
if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/) {
$month = $1; $day = $2;
if($month < 10 || $day < 10) {
printf "%s -> [[%d月%d日|%02d月%02d]]\n", $&, $month, $day, $month, $day;
}
else {
print "$& -> [[$month月$day日]]\n";
}
}
}
ちなみに、そのコードじゃ無限ループするぞ。
#!/usr/bin/perl
while($line = <STDIN>) {
if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/) {
$month = $1; $day = $2;
if($month < 10 || $day < 10) {
printf "%s -> [[%d月%d日|%02d月%02d]]\n", $&, $month, $day, $month, $day;
}
else {
print "$& -> [[$month月$day日]]\n";
}
}
}
304デフォルトの名無しさん
2009/08/06(木) 14:44:03 だめだ…コードの意味は分かるが,仕様が良く分からん.
305デフォルトの名無しさん
2009/08/06(木) 14:47:14 7月7日
という文字列を
[[7月7日|07月07日]]
と置き換える、ってことでしょ。
なんで分からんかなぁ。そっちのが分からん。
という文字列を
[[7月7日|07月07日]]
と置き換える、ってことでしょ。
なんで分からんかなぁ。そっちのが分からん。
306デフォルトの名無しさん
2009/08/06(木) 14:53:30 入力が07月07日だったら,
出力は[[07月07日|07月07日]]になるよね?これはOK?
そもそも,そういう入力は起こりえないの?
出力は[[07月07日|07月07日]]になるよね?これはOK?
そもそも,そういう入力は起こりえないの?
>>305
そんな感じです。
目的を言っていないので、何がやりたいのかよくわからないのだと思います。
早い話、Wikiの記法を使ってリンクを張りたいのです。
0をくわえて桁を調整している理由は
文字列としてソートして正しく昇順に並ぶようにするためです。例えばWikipediaなら
7月7日のときは、[[7月7日|07月07日]]とすることで
リンクはhttp://ja.wikipedia.org/wiki/7月7日
表示される文字列は 07月07日
となります。
これをソートできるテーブルの要素にします。参考までに
http://ja.wikipedia.org/wiki/Help:%E8%A1%A8%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9#.E5.86.8D.E6.95.B4.E5.88.97.E5.8F.AF.E8.83.BD.E3.81.AA.E8.A1.A8
この処理はawkでも可能なことは可能だったんですが、無知なせいか
おそろしく不格好になりました。
>>306
それ思いました。できれば
07月07日->[[7月7日|07月07日]]
のように処理したいです。
そんな感じです。
目的を言っていないので、何がやりたいのかよくわからないのだと思います。
早い話、Wikiの記法を使ってリンクを張りたいのです。
0をくわえて桁を調整している理由は
文字列としてソートして正しく昇順に並ぶようにするためです。例えばWikipediaなら
7月7日のときは、[[7月7日|07月07日]]とすることで
リンクはhttp://ja.wikipedia.org/wiki/7月7日
表示される文字列は 07月07日
となります。
これをソートできるテーブルの要素にします。参考までに
http://ja.wikipedia.org/wiki/Help:%E8%A1%A8%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9#.E5.86.8D.E6.95.B4.E5.88.97.E5.8F.AF.E8.83.BD.E3.81.AA.E8.A1.A8
この処理はawkでも可能なことは可能だったんですが、無知なせいか
おそろしく不格好になりました。
>>306
それ思いました。できれば
07月07日->[[7月7日|07月07日]]
のように処理したいです。
308デフォルトの名無しさん
2009/08/06(木) 18:26:07 >>303
それです。そういう意味です。
それです。そういう意味です。
309デフォルトの名無しさん
2009/08/06(木) 21:17:06 # gawk による match 関数の拡張を使っている.
# 一行に複数回現れた場合は無視.
BEGIN {
F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}
{
if ($0 ~ F) {
match($0, F, a);
if (a[1]+0 < 10 || a[2]+0 < 10) {
sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", $0, a[2], a[1], a[2], a[1]));
} else {
sub(a[0], sprintf("[[%d月%d日]]", $0, a[2], a[1]));
}
}
print $0;
}
# 一行に複数回現れた場合は無視.
BEGIN {
F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}
{
if ($0 ~ F) {
match($0, F, a);
if (a[1]+0 < 10 || a[2]+0 < 10) {
sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", $0, a[2], a[1], a[2], a[1]));
} else {
sub(a[0], sprintf("[[%d月%d日]]", $0, a[2], a[1]));
}
}
print $0;
}
310309
2009/08/06(木) 21:21:15 # 訂正.
BEGIN {
F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}
{
if ($0 ~ F) {
match($0, F, a);
if (a[1]+0 < 10 || a[2]+0 < 10) {
sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", a[1], a[2], a[1], a[2]));
} else {
sub(a[0], sprintf("[[%d月%d日]]", a[1], a[2]));
}
}
print $0;
}
BEGIN {
F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}
{
if ($0 ~ F) {
match($0, F, a);
if (a[1]+0 < 10 || a[2]+0 < 10) {
sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", a[1], a[2], a[1], a[2]));
} else {
sub(a[0], sprintf("[[%d月%d日]]", a[1], a[2]));
}
}
print $0;
}
311デフォルトの名無しさん
2009/08/06(木) 23:59:03 >>310 完璧です。今度からこれを使います有難うございました。
$ cat test.txt
1月1日 #m月d日
01月1日 #0m月d日
1月01日 #m月0d日
01月01日 #0m月0d日
2月10日 #m月dd日
02月10日 #0m月dd日
11月3日 #mm月d日
11月03日 #mm月0d日
12月16日 #mm月dd日
$ awk -f test.awk test.txt
[[1月1日|01月01日]] #m月d日
[[1月1日|01月01日]] #0m月d日
[[1月1日|01月01日]] #m月0d日
[[1月1日|01月01日]] #0m月0d日
[[2月10日|02月10日]] #m月dd日
[[2月10日|02月10日]] #0m月dd日
[[11月3日|11月03日]] #mm月d日
[[11月3日|11月03日]] #mm月0d日
[[12月16日]] #mm月dd日
$ cat test.txt
1月1日 #m月d日
01月1日 #0m月d日
1月01日 #m月0d日
01月01日 #0m月0d日
2月10日 #m月dd日
02月10日 #0m月dd日
11月3日 #mm月d日
11月03日 #mm月0d日
12月16日 #mm月dd日
$ awk -f test.awk test.txt
[[1月1日|01月01日]] #m月d日
[[1月1日|01月01日]] #0m月d日
[[1月1日|01月01日]] #m月0d日
[[1月1日|01月01日]] #0m月0d日
[[2月10日|02月10日]] #m月dd日
[[2月10日|02月10日]] #0m月dd日
[[11月3日|11月03日]] #mm月d日
[[11月3日|11月03日]] #mm月0d日
[[12月16日]] #mm月dd日
312デフォルトの名無しさん
2009/08/07(金) 06:34:47 最初にそういうテストバターンを出そうね
313デフォルトの名無しさん
2009/08/07(金) 11:45:35 ここの住人がコーディング好きだからって甘えやがって(´・ω・`)
> perlならわりと簡単なのですが、awkで簡単にいきますか?
って言ってるんだから、「いきます」って答えりゃいいんだよな
> perlならわりと簡単なのですが、awkで簡単にいきますか?
って言ってるんだから、「いきます」って答えりゃいいんだよな
314デフォルトの名無しさん
2009/08/07(金) 11:46:39 >>312
なにその死の行進こわい
なにその死の行進こわい
315デフォルトの名無しさん
2009/08/15(土) 11:36:30 バターン テストのデスマーチ
316デフォルトの名無しさん
2009/08/16(日) 09:46:09 自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L
名言集 その3
『いつもサボってばかりのキャップがウゼえ』
http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★
> 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0
> >>69
> 大変って言うか
> 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。
> ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて
> その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから
>
> 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
名言集 その3
『いつもサボってばかりのキャップがウゼえ』
http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★
> 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0
> >>69
> 大変って言うか
> 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。
> ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて
> その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから
>
> 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
318デフォルトの名無しさん
2009/10/24(土) 17:23:04 最後の10行を処理したくない場合、どう書けば良いでしょうか?
319デフォルトの名無しさん
2009/10/24(土) 18:19:03 最後まで読まずに最後の10行かどうか判定する方法は無いだろうな
処理対象がファイルなら、事前にwc -lか何かで行数調べて awk に渡してみては
処理対象がファイルなら、事前にwc -lか何かで行数調べて awk に渡してみては
320デフォルトの名無しさん
2009/10/24(土) 18:52:07 成る程、これ、という方法は無さそうですね
ちょっと考えながらやってみます
ちょっと考えながらやってみます
321デフォルトの名無しさん
2009/10/24(土) 19:15:52 とりあえず、こんな感じにしました
BEGIN {
SKIPTAILS = 10
}
{
line = buf[1]
for(i=1;i<SKIPTAILS;i++) buf[i] = buf[i+1]
buf[SKIPTAILS] = $0
}
NR > SKIPTAILS {
# lineを処理
}
BEGIN {
SKIPTAILS = 10
}
{
line = buf[1]
for(i=1;i<SKIPTAILS;i++) buf[i] = buf[i+1]
buf[SKIPTAILS] = $0
}
NR > SKIPTAILS {
# lineを処理
}
322デフォルトの名無しさん
2009/10/24(土) 22:11:41 >>321 考え方は同じだけど、forが気になったので
リングバッファで処理するようにしてみた。
BEGIN {
SKIPTAILS = 10
ringpos = SKIPTAILS
}
{
ringpos = (ringpos + 1) % SKIPTAILS
line = buf[ringpos]
buf[ringpos] = $0
}
NR > SKIPTAILS {
# lineを処理
}
リングバッファで処理するようにしてみた。
BEGIN {
SKIPTAILS = 10
ringpos = SKIPTAILS
}
{
ringpos = (ringpos + 1) % SKIPTAILS
line = buf[ringpos]
buf[ringpos] = $0
}
NR > SKIPTAILS {
# lineを処理
}
323デフォルトの名無しさん
2009/10/24(土) 23:18:06 ありがとうございます
リングバッファ、勉強になりました
使わせて頂きます
リングバッファ、勉強になりました
使わせて頂きます
324デフォルトの名無しさん
2009/11/19(木) 20:22:22325デフォルトの名無しさん
2009/11/23(月) 12:06:14 質問です
gawkで
{
printf("%d,%s\n", NR, $0 ) > FILENAME;
}
という行頭に番号を振って保存する処理をして
batファイルで一括処理させようとしたんですが
c:\windows\gawk\gawk -f g:\作業用\n.awk g:\作業用\*.txt
実行結果が
ファイル1 ファイル2
1A 4D
2B 5E
3C 6F
になります
ファイル2も
1D
2E
3F
にするにはどうしたらよいでしょうか?
gawkで
{
printf("%d,%s\n", NR, $0 ) > FILENAME;
}
という行頭に番号を振って保存する処理をして
batファイルで一括処理させようとしたんですが
c:\windows\gawk\gawk -f g:\作業用\n.awk g:\作業用\*.txt
実行結果が
ファイル1 ファイル2
1A 4D
2B 5E
3C 6F
になります
ファイル2も
1D
2E
3F
にするにはどうしたらよいでしょうか?
326デフォルトの名無しさん
2009/11/23(月) 12:27:22 FNR
327デフォルトの名無しさん
2009/11/23(月) 12:35:21328デフォルトの名無しさん
2009/12/21(月) 13:53:34 年末にパソコンを買い換えようと思って機種選びをしていてふと気づいた、
あれ、vaioのOSがWindows7 64bitバージョンに・・・
ダメじゃん!gawkが使えなくなってしまう・・・
うーん、、、またXPを買うべきか・・・悩む・・・
あれ、vaioのOSがWindows7 64bitバージョンに・・・
ダメじゃん!gawkが使えなくなってしまう・・・
うーん、、、またXPを買うべきか・・・悩む・・・
329デフォルトの名無しさん
2009/12/21(月) 14:21:01 >>328
自分でコンパイルし直せばいいだけじゃないの?
自分でコンパイルし直せばいいだけじゃないの?
330デフォルトの名無しさん
2010/01/14(木) 03:52:20 プログラミング言語AWK復刊だってね。
ttp://slashdot.jp/developers/article.pl?sid=10/01/06/0345207
多分必要性を感じない程度には使ってるから、買わないけど嬉しい。
布教用に買うってのもちょっとな。
ttp://slashdot.jp/developers/article.pl?sid=10/01/06/0345207
多分必要性を感じない程度には使ってるから、買わないけど嬉しい。
布教用に買うってのもちょっとな。
331デフォルトの名無しさん
2010/02/28(日) 11:08:56 AAA BBB CCC … -O ZZZ YYY XXX …
awk新参です。
-O(オプション)を検索し、
-Oとそれ以降をリダイレクトしたいのですが…
良い方法、ありますでしょうか
awk新参です。
-O(オプション)を検索し、
-Oとそれ以降をリダイレクトしたいのですが…
良い方法、ありますでしょうか
332デフォルトの名無しさん
2010/02/28(日) 15:36:31 リダイレクトってどういう意味で使ってる?
その AAA で始まる文字列も一体どういうものなの。
コマンドライン引数なのか、ファイルから読み込んでくるのとか。
用語と状況はきちんと書いてくれ。
その AAA で始まる文字列も一体どういうものなの。
コマンドライン引数なのか、ファイルから読み込んでくるのとか。
用語と状況はきちんと書いてくれ。
333デフォルトの名無しさん
2010/02/28(日) 16:19:07 D:\My Documents\gawk\331>type 331.txt
AAA BBB CCC … -O ZZZ YYY XXX 0…
AAA BBB CCC … -O ZZZ YYY XXX 1…
AAA BBB CCC … -O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>type 331.awk
{match($0, " -O .*", a);
print a[0];}
D:\My Documents\gawk\331>gawk -f 331.awk 331.txt >a.txt
D:\My Documents\gawk\331>type a.txt
-O ZZZ YYY XXX 0…
-O ZZZ YYY XXX 1…
-O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>
AAA BBB CCC … -O ZZZ YYY XXX 0…
AAA BBB CCC … -O ZZZ YYY XXX 1…
AAA BBB CCC … -O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>type 331.awk
{match($0, " -O .*", a);
print a[0];}
D:\My Documents\gawk\331>gawk -f 331.awk 331.txt >a.txt
D:\My Documents\gawk\331>type a.txt
-O ZZZ YYY XXX 0…
-O ZZZ YYY XXX 1…
-O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>
334331
2010/02/28(日) 18:43:32335デフォルトの名無しさん
2010/02/28(日) 19:00:04 Q: make spits out errors like Makefile.awk:256: fatal: match() cannot have 3 arguments
A: Your AWK is too old to recreate the Makefile. The build is done based on the distributed Makefile. Everything shall compile successfully though.
So if the compile succeeds just ignore such errors, please.
A: Your AWK is too old to recreate the Makefile. The build is done based on the distributed Makefile. Everything shall compile successfully though.
So if the compile succeeds just ignore such errors, please.
336335
2010/02/28(日) 19:22:38 {print substr($0, match($0, " -O .*")+1);}
338デフォルトの名無しさん
2010/02/28(日) 22:25:50 ボソ 本当に勉強になったかどうかは疑問だ・・・
おっと一言オウかったか。
おっと一言オウかったか。
339デフォルトの名無しさん
2010/03/04(木) 15:04:38 gsub()とかで引数に変数を利用したいのですがどうすればいいのでしょうか?
gsub(str1,str2)みたいに。
gsub(str1,str2)みたいに。
340デフォルトの名無しさん
2010/03/04(木) 21:44:52 >>339
man gawkより
gsub(r, s [, t])
For each substring matching the regular expression r in the string t,
substitute the string s, and return the number of substitutions.
If t is not supplied, use $0. An & in the replacement text is
replaced with the text that was actually matched. Use \& to get a
literal &. (This must be typed as "\\&"; see GAWK: Effective AWK
Programming for a fuller discussion of the rules for &'s and
backslashes in the replacement text of sub(), gsub(), and gen sub().)
man gawkより
gsub(r, s [, t])
For each substring matching the regular expression r in the string t,
substitute the string s, and return the number of substitutions.
If t is not supplied, use $0. An & in the replacement text is
replaced with the text that was actually matched. Use \& to get a
literal &. (This must be typed as "\\&"; see GAWK: Effective AWK
Programming for a fuller discussion of the rules for &'s and
backslashes in the replacement text of sub(), gsub(), and gen sub().)
341デフォルトの名無しさん
2010/03/08(月) 21:36:03 awk 'BEGIN{x="ABCDE";y="BCD";z="XXX";gsub(y,z,x);print x}'
何が難しいのかよくわからん。
何が難しいのかよくわからん。
342デフォルトの名無しさん
2010/03/17(水) 22:07:37 時々awkだと遅いのでperlに書き換えるという人がいますが、
実際のところ速くなるんでしょうか?
私の環境ではforループや加算などはawkのほうが速そうですが、
どのような処理の場合にperlのほうが速くなりますか?
$ time mawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};printf("%f\n" ,x)}'
500000500000.000000
real 0m0.131s
user 0m0.120s
sys 0m0.000s
$ time gawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};print x}'
500000500000
real 0m0.289s
user 0m0.284s
sys 0m0.000s
$ time perl -e '$x=0;for($i=1;$i<=1000000;$i++){$x=$x+$i};print $x'
500000500000
real 0m0.379s
user 0m0.376s
sys 0m0.004s
実際のところ速くなるんでしょうか?
私の環境ではforループや加算などはawkのほうが速そうですが、
どのような処理の場合にperlのほうが速くなりますか?
$ time mawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};printf("%f\n" ,x)}'
500000500000.000000
real 0m0.131s
user 0m0.120s
sys 0m0.000s
$ time gawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};print x}'
500000500000
real 0m0.289s
user 0m0.284s
sys 0m0.000s
$ time perl -e '$x=0;for($i=1;$i<=1000000;$i++){$x=$x+$i};print $x'
500000500000
real 0m0.379s
user 0m0.376s
sys 0m0.004s
343デフォルトの名無しさん
2010/03/17(水) 22:26:14 >>342
「awkだと遅いのでperlに書き換えるという人」 に聞けば分かる
「awkだと遅いのでperlに書き換えるという人」 に聞けば分かる
344デフォルトの名無しさん
2010/03/19(金) 09:08:06345デフォルトの名無しさん
2010/03/20(土) 01:03:01 カーニハンとパイクの『プログラミング作法』にawkとperl
(とCとC++とJAVA)の比較があるな
今のマシン使って書き換えなきゃならないほど遅いって
どんな処理なんだろう?
(とCとC++とJAVA)の比較があるな
今のマシン使って書き換えなきゃならないほど遅いって
どんな処理なんだろう?
346デフォルトの名無しさん
2010/03/21(日) 13:44:10 >342
awk 等を組み合わせて実行するとプロセス起動のコストがかかるので perl で一つに纏める、という話じゃないの?
awk 等を組み合わせて実行するとプロセス起動のコストがかかるので perl で一つに纏める、という話じゃないの?
347デフォルトの名無しさん
2010/03/22(月) 17:35:11 文字コードのコードを変数にして文字列を操作することってできますか?
文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
348デフォルトの名無しさん
2010/03/22(月) 18:01:58 Use iconv.
349デフォルトの名無しさん
2010/03/22(月) 18:25:10 > 文字コードのコードを変数にして文字列を操作することってできますか?
なにをしたいのかよくわかんないんだけど。
> 文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
華麗なのはtrコマンドを使う方法。ただtrがマルチバイトをうまく扱ってくれるか
どうかはこころもとない。
Perlならtrを、Rubyなら文字列クラスのtrメソッドを、
Pythonならstringモジュールのmaketrans関数と文字列のメソッドtransleteを使う、
という手がある。
awkないし(tr以外の)古典的なツールで華麗にやる方法はないと思う。
なにをしたいのかよくわかんないんだけど。
> 文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
華麗なのはtrコマンドを使う方法。ただtrがマルチバイトをうまく扱ってくれるか
どうかはこころもとない。
Perlならtrを、Rubyなら文字列クラスのtrメソッドを、
Pythonならstringモジュールのmaketrans関数と文字列のメソッドtransleteを使う、
という手がある。
awkないし(tr以外の)古典的なツールで華麗にやる方法はないと思う。
350デフォルトの名無しさん
2010/03/24(水) 17:11:16 Excelで
全角半角変換は ASC()
半角全角変換は JIS()
全角半角変換は ASC()
半角全角変換は JIS()
351デフォルトの名無しさん
2010/03/25(木) 08:34:11 >>347
1. EUC-JPにして(nkfとか)kakasi で、戻す
2. それだったら最初から、nkf -Z
3. gawk前提で、文字毎に処理(LANGを指定して子プロセス起動)
awkの中で閉じてやるのはめんどくさそう
1. EUC-JPにして(nkfとか)kakasi で、戻す
2. それだったら最初から、nkf -Z
3. gawk前提で、文字毎に処理(LANGを指定して子プロセス起動)
awkの中で閉じてやるのはめんどくさそう
352デフォルトの名無しさん
2010/03/29(月) 23:34:27 gawk 3.1.6
system(cmd) を使うと、アンチウィルスソフト(kaspersky)の
アプリケーション履歴にバッチファイルが登録されるのを発見。
close(cmd) しても同じ。
while(cmd|getline>0){}
で代用すると残らなくなった。??
system(cmd) を使うと、アンチウィルスソフト(kaspersky)の
アプリケーション履歴にバッチファイルが登録されるのを発見。
close(cmd) しても同じ。
while(cmd|getline>0){}
で代用すると残らなくなった。??
353デフォルトの名無しさん
2010/05/13(木) 00:22:57 仏でブルカ否定の決議採択 「国の価値観と相容れない」
http://www.cnn.co.jp/world/AIC201005120004.html
テヘランで、ブルカを着て入出国する時って、顔のチェックどうするんだろう。
他人や男でもばれないの?
http://www.cnn.co.jp/world/AIC201005120004.html
テヘランで、ブルカを着て入出国する時って、顔のチェックどうするんだろう。
他人や男でもばれないの?
354デフォルトの名無しさん
2010/05/13(木) 00:23:49 >>353
誤爆スマン
誤爆スマン
355デフォルトの名無しさん
2010/05/14(金) 13:38:24356デフォルトの名無しさん
2010/05/18(火) 10:51:40 awkのprintについてご教示下さい。
下のような出力が有った場合、例えば
lrwxrwxrwx 1 root root 70 May 18 10:37 hoge
ls -al | awk '{print$1$2$2$4$6$7$8$9}' とすれば「$5」の
「70」を抜くことが出来ますが、これが$100とかまで続く場合、
「$5」だけを抜きたい場合記述が大変になります。
何か良い方法は無いものでしょうか?
下のような出力が有った場合、例えば
lrwxrwxrwx 1 root root 70 May 18 10:37 hoge
ls -al | awk '{print$1$2$2$4$6$7$8$9}' とすれば「$5」の
「70」を抜くことが出来ますが、これが$100とかまで続く場合、
「$5」だけを抜きたい場合記述が大変になります。
何か良い方法は無いものでしょうか?
357デフォルトの名無しさん
2010/05/18(火) 11:01:32 $nに代入があると、その時点で$0が再構成される。
区切りの空白が$5のあったところだけ2個になるのが気にならなければ、
ls -al | awk '{$5 = ""; print}'
とすればよい。
空白2個を修正するならこうする。
ls -al | awk '{$5 = ""; print $0}' | awk '{$1 = $1; print}'
区切りの空白が$5のあったところだけ2個になるのが気にならなければ、
ls -al | awk '{$5 = ""; print}'
とすればよい。
空白2個を修正するならこうする。
ls -al | awk '{$5 = ""; print $0}' | awk '{$1 = $1; print}'
358デフォルトの名無しさん
2010/05/18(火) 11:03:15 $0 は余計だった。
ls -al | awk '{$5 = ""; print}' | awk '{$1 = $1; print}'
ls -al | awk '{$5 = ""; print}' | awk '{$1 = $1; print}'
359デフォルトの名無しさん
2010/05/18(火) 11:07:03 2つめのawkの$1 = $1は何のため?
360デフォルトの名無しさん
2010/05/18(火) 11:34:06 なにもしないと、$0は読み込んだそのままなので空白2個は空白2個のまま。
$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入されるので、
空白2個だったところが空白1個になる。
$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入されるので、
空白2個だったところが空白1個になる。
361デフォルトの名無しさん
2010/05/18(火) 11:35:04 2つめのawkに食わせた時点で$n (n>0)は詰まるけど$0は入力行そのまま
空白2個なので$0を再構成すると空白1個区切りになる
空白2個なので$0を再構成すると空白1個区切りになる
362デフォルトの名無しさん
2010/05/18(火) 12:21:12363デフォルトの名無しさん
2010/05/18(火) 15:08:38 $1 = $1 ってイマイチよく解らん
$1ってFSで区切られた一つ目だよね?
なんでそれ自身を自分に代入したらスペースが消えるん?
$1ってFSで区切られた一つ目だよね?
なんでそれ自身を自分に代入したらスペースが消えるん?
364デフォルトの名無しさん
2010/05/18(火) 15:27:35 $0の再構成が行われるからって説明されてるだろ。
$0の再構成とはいったんばらした$1,$2,...をOFSを挟んで
つなげ直すってことなので、何で区切られていたかは
保存されない。
$0の再構成とはいったんばらした$1,$2,...をOFSを挟んで
つなげ直すってことなので、何で区切られていたかは
保存されない。
365デフォルトの名無しさん
2010/05/18(火) 15:41:56366デフォルトの名無しさん
2010/05/18(火) 15:42:39 ちょっと気になって試してみた。
% echo a b | gawk '{OFS="-";$1=$1;OFS="=";print}'
a=b
再構成は$1=$1をやってすぐじゃなくて、次に$0が使われるとき、ってこと
なのかな?
% echo a b | gawk '{OFS="-";$1=$1;OFS="=";print}'
a=b
再構成は$1=$1をやってすぐじゃなくて、次に$0が使われるとき、ってこと
なのかな?
367365
2010/05/18(火) 16:27:59 解った
http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html
警告: 一部のバージョンのawkは NFを減じたときに$0の再構築を行わない。
結局のところ、awkにレコード全体の再構築を強制したときにはその時点で
フィールドの値とOFSが使われる。再構築を行うためには、何らかの無害な
代入を行う:
$1 = $1 # force record to be reconstituted
賢くなった。あんがと。
http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html
警告: 一部のバージョンのawkは NFを減じたときに$0の再構築を行わない。
結局のところ、awkにレコード全体の再構築を強制したときにはその時点で
フィールドの値とOFSが使われる。再構築を行うためには、何らかの無害な
代入を行う:
$1 = $1 # force record to be reconstituted
賢くなった。あんがと。
368デフォルトの名無しさん
2010/05/18(火) 16:46:58 awkは奧が深いのぉ
369デフォルトの名無しさん
2010/05/19(水) 22:24:52 久しぶりにいいもんを見させてもらいますた><
370デフォルトの名無しさん
2010/05/24(月) 09:55:14 知らなかった。
勉強になった。
勉強になった。
371デフォルトの名無しさん
2010/05/24(月) 15:25:46 みんな>357のお蔭で多くを学んだな。
372デフォルトの名無しさん
2010/05/29(土) 04:53:07 名前:
E-mail:
内容:
cygwinだと
% cut -f1 -d, hoge.csv
より
% awk -F, '{print $1}' hoge.csv
の方が速かった。
#実行時間ね
#Perl?シラネ
E-mail:
内容:
cygwinだと
% cut -f1 -d, hoge.csv
より
% awk -F, '{print $1}' hoge.csv
の方が速かった。
#実行時間ね
#Perl?シラネ
373デフォルトの名無しさん
2010/06/07(月) 11:45:38374デフォルトの名無しさん
2010/06/07(月) 12:04:05 手元のlinux環境だとcutの方が速いという普通の結果でしたが。
hoge.csvは6桁の乱数3つを「,]で区切って並べた100万行の
ファイルです。
% time cut -f1 -d, hoge.csv >/dev/null
cut -f1 -d, hoge.csv > /dev/null 0.21s user 0.01s system 99% cpu 0.222 total
% time awk -F, '{print $1}' hoge.csv >/dev/nulll
awk -F, '{print $1}' hoge.csv > /dev/nulll 1.52s user 0.03s system 99% cpu 1.558 total
ちなみにバージョンは
cut (GNU coreutils) 8.5
GNU Awk 3.1.7
hoge.csvは6桁の乱数3つを「,]で区切って並べた100万行の
ファイルです。
% time cut -f1 -d, hoge.csv >/dev/null
cut -f1 -d, hoge.csv > /dev/null 0.21s user 0.01s system 99% cpu 0.222 total
% time awk -F, '{print $1}' hoge.csv >/dev/nulll
awk -F, '{print $1}' hoge.csv > /dev/nulll 1.52s user 0.03s system 99% cpu 1.558 total
ちなみにバージョンは
cut (GNU coreutils) 8.5
GNU Awk 3.1.7
375デフォルトの名無しさん
2010/06/07(月) 12:22:48 あーなるほど、なんか判った。cygwinのfgetc()が遅いからじゃないかな。
fgetc()とfgets()で時間を較べたときにfgetc()の方がずっと遅かった記憶がある。
fgetc()とfgets()で時間を較べたときにfgetc()の方がずっと遅かった記憶がある。
376デフォルトの名無しさん
2010/09/13(月) 14:14:54 xgawk (gawkでなく)にとあるwebページを食べさせると、XMLERRR (not well-formed)で中断します。
そのページがwell-formedか極悪かは私にとってどうでもよく、単に内容を得たいだけなので、文末まで処理し終えて欲しいのです。
どうにかならないでしょうか。
そのページがwell-formedか極悪かは私にとってどうでもよく、単に内容を得たいだけなので、文末まで処理し終えて欲しいのです。
どうにかならないでしょうか。
377デフォルトの名無しさん
2010/09/25(土) 14:55:22 シェルスクリプト内でパイプ入力されたものを処理する
アクションをヒアドキュメントで書く事は出来るでしょうか。
アクションをヒアドキュメントで書く事は出来るでしょうか。
378デフォルトの名無しさん
2010/09/27(月) 14:57:18 質問です。
データが
|1|aaa|
|2|bbb|
|3|ccc|
などとなっているとき
aaa
bbb
ccc
を取り出そうとして
awk 'FS="|"{print $3}' ファイル名
としたんですが、1行目だけがうまくとれません。
データファイルの1行目を空行にすれば解決できないことはないんですが、
空行を入れ忘れてしまう懸念があります。
どうすればいいんでしょうか?
データが
|1|aaa|
|2|bbb|
|3|ccc|
などとなっているとき
aaa
bbb
ccc
を取り出そうとして
awk 'FS="|"{print $3}' ファイル名
としたんですが、1行目だけがうまくとれません。
データファイルの1行目を空行にすれば解決できないことはないんですが、
空行を入れ忘れてしまう懸念があります。
どうすればいいんでしょうか?
379デフォルトの名無しさん
2010/09/27(月) 15:01:46 やりたいことは awk 'BEGIN {FS="|"} {print $3}' じゃないかと思うんだけど
380デフォルトの名無しさん
2010/09/27(月) 15:08:38381デフォルトの名無しさん
2010/09/27(月) 18:42:12 gensub()にて、マッチした10番目以降のグループの指定の仕方を教えてください。
下記サイトでは、17番目まで普通に指定できるような事が書いてあるけど、
http://tounderlinedk.blogspot.com/2010/08/gensub-n-awk.html
gensub(pattern,"\\10","g",$2) とかくと
\\1(マッチ箇所)と0(文字)として解釈されちゃって上手くいなかい。
シェルスクリプト風かと思って、\\{10} も試したけどダメダッター。
GNU Awk 3.1.5です。
下記サイトでは、17番目まで普通に指定できるような事が書いてあるけど、
http://tounderlinedk.blogspot.com/2010/08/gensub-n-awk.html
gensub(pattern,"\\10","g",$2) とかくと
\\1(マッチ箇所)と0(文字)として解釈されちゃって上手くいなかい。
シェルスクリプト風かと思って、\\{10} も試したけどダメダッター。
GNU Awk 3.1.5です。
382381
2010/09/27(月) 19:00:47 BSDのjmanには、1から9までの数字って明記されてるなあ。
実装によって違うのかなあ
パターンを動的に生成してマッチさせようとしてるから結構困る(´・ω・`)
http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html
実装によって違うのかなあ
パターンを動的に生成してマッチさせようとしてるから結構困る(´・ω・`)
http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html
383デフォルトの名無しさん
2010/09/27(月) 19:04:47 >>381
マニュアルには1から9までって書いてあるし
Within the replacement text s, the sequence \n, where n is a digit from 1 to 9, may be
used to indicate just the text that matched the n'th parenthesized subexpression.
ソースの該当箇所(builtin.cの2542行目あたりから)みても1桁限定のロジックだよ。(3.1.7調べ)
int dig = scan[1] - '0';
なんてやってる。
マニュアルには1から9までって書いてあるし
Within the replacement text s, the sequence \n, where n is a digit from 1 to 9, may be
used to indicate just the text that matched the n'th parenthesized subexpression.
ソースの該当箇所(builtin.cの2542行目あたりから)みても1桁限定のロジックだよ。(3.1.7調べ)
int dig = scan[1] - '0';
なんてやってる。
384デフォルトの名無しさん
2010/09/27(月) 19:08:03 一旦ぶった切るしかないんじゃね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★2 [蚤の市★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★7 [蚤の市★]
- 最新版Z級クソ映画ランキングが決定! [牛丼★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★2 [蚤の市★]
- 公用車カーナビのNHK受信料「全額免除を」 千葉市議会、国に制度創設求める意見書可決 [少考さん★]
- 【朗報】南鳥島のレアアース、中国産の「20倍の純度」青山繁晴氏「日本は資源大国」日本復活のファンファーレが鳴り響く! [673057929]
- 麻婆豆腐食べてる
- 愛国者「釘を使わない日本独自の伝統工法スゴイ!」X民「それ中国起源ですよ」→批判殺到 [834922174]
- 【安倍の実】大誤算!日本企業、円安で苦しむ、、適正為替より大幅に乖離。助けて高市 [219241683]
- 👊😅👊三☁😶‍🌫三⛅🏡
- コーヒー、来年3月から30パーセント値上げへ [709039863]
