awk ファンクラブ (333レス)
1-

116: 2011/06/08(水)01:01 ID:48mfCmU6(1) AAS
そっかー、分かり易さは、上の方だと思ったのですよ。
下のは、awkがどう動くかを知ってないと気持ち悪い感じ。
101みたいなsedスクリプトを、初めて見たときのような。
117
(2): 2011/06/08(水)06:42 ID:3juXEiES(1) AAS
上だと\n\rになっちゃうけど
CRLFの\r\nとは違うから
Windowsでは認識しないのでは?
118: 2011/06/08(水)12:16 ID:AGBbsX8a(2/2) AAS
>>117
いや、上のコードは\rが先に出力されるからあってるよ、改行じゃなくて普通の可読文字でためしてみ
119
(1): 2011/06/09(木)23:01 ID:b4gs0WW2(1) AAS
Windows向けの改行をUnix向けに置き換える
awk 1 RS=\\r ORS=

改行弄ったら戻したいよね。一文字多い別解。
awk 'sub(/\r/,"")'

>>117
$0にRSは含まれない。print文での出力のときにORSが付けられる。
だから、114のような書き方ができるのです。

え?素直にnkfとかtr使うべきだって?ごめんちゃい。
tr -d \\r
nkf -d
省1
120: 2011/06/12(日)23:20 ID:8N8UbY4v(1) AAS
正規表現にマッチした部分を全て置換し、その行を表示する
awk 'gsub(/foo/,"bar")'

sedで書くとこうか。
sed -n 's/foo/bar/gp'
こういう処理はsedの方が楽に書けるのかな、うーん。

>>119
awk 'sub(/\r/,"")+1'
下はこの方が良かった。うっかりファイルの内容を消してしまいそうだ。
121: 2011/06/13(月)19:11 ID:NkVjy07h(1) AAS
だいたい置換はsedで書いたほうが素直に読みやすいと思う
逆にそれ以外のツールでもスクリプトでもなく、awkで書きたくなるのはフィールドを使うものかな
122
(1): 2011/06/13(月)22:57 ID:0YRj9/YK(1) AAS
いや、しかし最近目から鱗落ちまくりです。沢山の書き込みに感謝感謝。
123: 2011/06/14(火)21:28 ID:ODOs6IfG(1) AAS
中身の検索はgrep
置換はsedとかtr
結合はcatとかpaste
計算はexprとか場合によりwc
多少組み合わせる必要があるならshでシェルスクリプトwhile、for、read、shiftみたいな

大抵やりたいことに対応するコマンドがある。awkでプログラム風に書くのは人を選ぶのかもね。
このスレが太古の昔に沈んでしまったのも、そのせいか。
実際、プログラム板にもあるけど、あちらはそこそこ書き込みがある。

Linuxも既にGUI全盛、バッチ処理もGUIでという流れか、シェルスクリプト総合スレもなくなってしまったし。
板全体がほとんど動作報告中心になって、Linuxやシステム全体のコアな部分、プログラミングの話題を
省1
124: 2011/06/14(火)23:04 ID:CILjaNiq(1) AAS
シェルスクリプトはUnix板で話せばいいしな
Linuxでメジャーなシェルは大概BSDとかでも使えるし
125
(1): 2011/06/15(水)21:26 ID:QLTzRiMx(1) AAS
HTMLファイルからタイトル(title要素の持つ文字列)を取得する
awk '/<title>/{ b=1 }; b{ s=s $0 RS }; /<\/title>/{ gsub(/.*<title>|<\/title>.*/,"",s); print s; exit }'

分かりやすさと効率を無視、短さを優先した別解。
awk '{ s=t=s $0 RS }; gsub(/.*<title>|<\/title>.*/,"",t)>1{ print t; exit }'

どっかのスレにて、出遅れ、荒れ気味なので。
改行も保存してるけど、必要ないならRSを除けばいい。
perlの無いシステムでもawkはある!はず。

いつの間にかUnix板のシェルスクリプトスレまで無くなってやがる…
126: 2011/06/15(水)22:50 ID:QFQ0PbYI(1) AAS
ホントだ、何でだろ
127: 2011/06/16(木)00:11 ID:oqM9OV4C(1) AAS
980超えたからだな
128
(1): 2011/06/16(木)00:29 ID:G4IIl/GQ(1) AAS
ああ、そうだったのかー。でもまだ次スレ建ってないね。
スレ建てた事無いから分からないけど、最近建て難いようだし、そのせいかな。

112で諦めたgrepで空行を削除する処理の時間計測の結果。
time cat src.txt |grep . >/dev/null

real 342m52.646s
user 337m34.249s
sys 0m7.174s

grep -V
GNU grep 2.6.3

寝て起きたら終わっていた。余程grepを必要とするときくらいしか、使うべきじゃない。
省1
129
(1): 2011/06/16(木)09:39 ID:iftKRWTE(1) AAS
>>125
それ、xgawkで書くとどんなになるの?
130
(1): 2011/06/16(木)10:18 ID:x2P5GNsY(1) AAS
>>129
gawk '$0=gensub("</?title>", "", "g", RT)' RS='<title>.*</title>' IGNORECASE=1
131
(3): 2011/06/19(日)18:13 ID:O1oYVV5e(1) AAS
>>128
待てよ…awkでもパターン検索だけなら遜色なく書けて
かつawkのが速いんじゃ、grepの存在価値って…

ああ、複数ファイルからの検索があるか
つーても、これもawkでFILENAMEとFNR明示したら書けちゃうか…
132: 2011/06/20(月)00:28 ID:rO0fE487(1) AAS
>>131
まあgrepで済む物は記述が簡単なわけで。
133: 2011/07/01(金)01:20 ID:NsJJwAAV(1/3) AAS
xgawkは使ってないなぁ。使ってる鳥には無いし。XHTMLが対象ならもっと短く書けるのだろうか。

>>130
おー!これはクール。
gawkは大文字小文字無視する処理書くの楽だね。流石だ。

>>131
前後の行を表示させたりが楽かも。まあ、滅多にお世話になることないけど…
rm -r *でデータ飛ばしたから、そのサルベージに役立つとは…orz
134
(1): 2011/07/01(金)02:00 ID:NsJJwAAV(2/3) AAS
コマンド`grep -C N regex'を真似する
awk 'BEGIN{ L=N; b=L+1; n=L+2; i=j=0; s=2 };
    /regex/{ if (L&&s==1) print "--"; while (i!=j) { print a[i++]; if (i==b) i=0 } n=s=0 };
    n>L{ a[j++]=$0; if (j==b) j=0; if (i==j) { i++; if (i==b) i=0; if (!s) s++ } next }; n++<=L'

書けた!!データ飛ばすは、アク禁に巻き込まれるは散々だった。よく見たら凄い遅レスだ…
データのサルベージに使ったgrep -Cを書いてみた。流石にワンライナーとは言い難い。
効率はもう少し良くできそうだけど、これ以上短くするのは無理だった。実力が足りない;_;

あまりに読み辛いので、pastebinに整形版を置いておきます。
外部リンク:pastebin.com
135
(1): 2011/07/01(金)23:56 ID:NsJJwAAV(3/3) AAS
時間計測の結果を追記。

time grep -C 500 'public class\|jar cf\|javac\|\.java' <strings_a.txt >/dev/null
real 0m2.112s
user 0m1.528s
sys 0m0.311s

time awk 'BEGIN{ L=500;(略)}; /public class|jar cf|javac|\.java/{(略)}; n++<=L' <strings_a.txt >/dev/null
real 1m20.089s
user 1m15.426s
sys 0m0.389s

一回計測。約50倍くらい遅いか。ネイティブとスクリプトだから、まあこうなる、と言ったところだと思う。
省1
136: 2011/07/04(月)00:51 ID:Zh/tRXtG(1) AAS
指定された正規表現を含むファイルの名前を表示する
awk 'f!=FILENAME && /regex/{ print f=FILENAME }'

gawkならこう書ける。
awk '/regex/{ print FILENAME; nextfile }'

>>131に近い。FNRも使って検索結果を表示するスクリプトも、あまり複雑にはならなそう。
下の方が速いけど、mawkだとnextfileをサポートしてなかった。
grep -lと同じ結果で、指定する正規表現によってawkの方が速く動くこともあるよ。
137: 2011/07/05(火)00:27 ID:iZUKjs1P(1) AAS
AwkのGNU実装、「Gawk 4.0」が登場
外部リンク:sourceforge.jp
138: 2011/07/06(水)07:36 ID:Q5KmFo/I(1) AAS
dgawk便利だね。
139: 2011/07/07(木)02:54 ID:bHkfWT8R(1) AAS
md5sumコマンドの出力から重複するMD5チェックサムを持つファイルを列挙する
awk '{ i=++a[$1,0]; a[$1,i]=$0 }; END{ for (i in a) if (!k[split(i,k,SUBSEP)] && a[i]>1) for (j=1; j<=a[i]; j++) print a[k[1],j] }'

まだ短く書けそうかな?
あるディレクトリ以下を調べるなら、こんな感じでMD5チェックサムを計算する。
find sda6.photorec -type f -exec md5sum '{}' +
この出力をパイプか何かで食わせればいい。

gawkの4.0が出たか。いろんな亜種を使う機会があるから、なかなか依存したプログラムは書けないね。
よく使うのはgawkとmawkだけど、皆何をよく使ってるのだろう?使用者が少ないから余計に気になる。

デバッガって使いやすい?いまだにprintで表示してやってるなぁ。
140
(1): 2011/07/07(木)11:14 ID:WpiH6Omg(1) AAS
gdbやpythonデバッガやらと似てるのでとっつきやすくはあると思う。
141
(1): 2011/07/08(金)00:37 ID:gfdD9pMC(1) AAS
fileコマンドの出力からテキストファイル(表示可能なファイル)だけ取得する
awk '{ q=$1; $1="" }; /text/{ print q }' -F:

FSは-Fオプションを使って1文字短く書く。使い方は次のようにパイプでつなぐ。
find sda6.photorec -type f -exec file '{}' + |awk '{ q="'\''" $1 "'\''"; $1="" }; /text/{ print q }' -F: |xargs -i cp -v "{}" sda6.photorec.text/

xargsに渡すためクォートしてる。ワンラインにシングルクォーテーション入ると書きづらい。
でも、こういう処理はawkが一番楽だね。

>>140
へー、それは良いね!って思ったけど自分が書くような短いスクリプトには不要かも…
今、awkでデバッガが重宝するような長いスクリプトって、どれほど書かれてるんだろう?
142
(1): 2011/07/08(金)17:00 ID:Iqd7ejAo(1) AAS
gawkだけでurlエンコードできますか?
143: 2011/07/08(金)17:42 ID:baIcylwh(1) AAS
>>142
BEGIN{for(;i<256;++i)c[t=sprintf("%c",i)]= i==32?"+":t~/[0-9A-Za-z]/?t:"%"sprintf("%x",i)}
{for(s=i="";i++<length;s=s c[substr($0,i,1)]); print s}

マルチバイト対応してて length() とか substr() とかが
バイト数ではなく文字数を数えて動作するような小賢しい awk だと逆に動かない。
144: 2011/07/08(金)19:08 ID:gwMiQJC1(1) AAS
Gawk4.0の新オプションはそういう時のためにある訳か。
145
(1): 2011/07/08(金)19:46 ID:CbA9+OJF(1) AAS
>>141
ファイル名には : も使えるから汎用じゃないね。
あとショートコードを意識してるようなのに不必要なセミコロンとカッコ内側のスペースが
あるのはスタイルとして一貫してないな。
1-
あと 188 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.017s