awk ファンクラブ
■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin
2008/07/07(月) 20:45:18ID:wYmB5VwU0042login:Penguin
2009/07/18(土) 16:20:59ID:p/gu39Bx> そんなん普通に複数ファイル処理すればいいやん。
「普通に」の所kwsk
0043login:Penguin
2009/07/18(土) 21:51:54ID:VCKoFo8D0044login:Penguin
2009/07/19(日) 04:55:45ID:TalGZSORawkでアクセスカウンタを作ろうと思い、
以下のようなスクリプトを書いたのですが、
最後のhtmlへの出力(表示)の方法がわかりません。
どうしたらいいのでしょうか?
004544
2009/07/19(日) 04:57:30ID:TalGZSOR#プロセスロック
lock()
#カウント数の読み込み
while (getline < count.dat > 0){
before_count = $1;
}
close(count.dat);
#カウントを1進める
new_count = before_count + 1;
#数字の置換を行う
sub(before_count, new_count, $1);
#プロセスロック解除
unlock()
}
004644
2009/07/19(日) 04:58:33ID:TalGZSORprint "\r";
END{
#表示テンプレートの読み込み
while (getline < count.txt > 0){
txt_file[++i] = $0;
}
close(count.txt);
#あらかじめセットしてあるテンプレート上の文字列を置換
gsub("<!--#count.cgi--!>", new_count, $0);
print $0;
}
0047login:Penguin
2009/07/19(日) 11:16:35ID:xa/YVpR4getline知らなかったわ。
難しそうだな・・・
0048login:Penguin
2009/07/19(日) 15:13:23ID:Ge8Nt7PtSSIの仕組みは理解できていますか。
ttp://httpd.apache.org/docs/2.0/ja/howto/ssi.html
0049hogehoge
2009/07/21(火) 14:50:51ID:PUGBjRE4頭が劣化しとるわー
0050login:Penguin
2009/08/01(土) 15:31:08ID:z6H8O5Srttp://mitya.pp.ru/chamberlen/assorted/OReilly%20-%20Sed%20&%20Awk%202nd%20Edition.pdf
0051login:Penguin
2009/08/15(土) 20:33:21ID:7GY0b2Yyターミナルでawk '{print $0}' filenameですと日本語が悲しいです。
お使いのみなさん、使用法等教えて下さい。
0052login:Penguin
2009/08/19(水) 18:02:30ID:GJ3CGMhT0053login:Penguin
2009/08/22(土) 09:19:23ID:rmix/tnghttp://pc11.2ch.net/test/read.cgi/mac/1247059597/
こっちのが詳しいかもね
0054正月前
2009/12/29(火) 22:19:45ID:UAwxD9+5awkにはperlのjoinみたいの関数ありますか?
perl:
print join(":",$_);
0055login:Penguin
2009/12/30(水) 01:06:12ID:Q1gMau4C0056login:Penguin
2009/12/30(水) 01:44:22ID:jMgIWDpOBEGIN {OFS=":"}{$1=$1;print}
0057正月前
2009/12/31(木) 16:45:37ID:z/pUNj8p教えて頂ければ幸いです。
-----------------------------
hoge='a:b:c:d:a:b:c:d:a'
echo -n $hoge | perl -F: -ane 'chop;foreach(@F){$s{$_}++ or push(@b,$_)}print join(":",@b)'
-----------------------------
0058login:Penguin
2010/01/05(火) 11:48:18ID:iQ1ypvd/echo -n $hoge | awk 'BEGIN{OFS=":"}{n=split($0,a,":");m=1;for(i=1;i<=n;i++){if(!(a[i]in b)){$m=a[i];b[$m]++;m++}}print}'
0059login:Penguin
2010/01/05(火) 12:34:43ID:APedkSZb0060login:Penguin
2010/01/05(火) 12:50:31ID:APedkSZb!a[$0]++ とした方が1バイト短くなるな
って、そういう趣旨じゃないか
0061login:Penguin
2010/01/08(金) 21:03:31ID:pPQjxZAIhttp://www.fukkan.com/fk/CartSearchDetail?i_no=68313239&tr=t
0062正月前
2010/01/11(月) 22:20:00ID:jx5sxsA2ご回答、誠に有難うございました!
まだawkの部分理解してないけど、期待通りの動作が確認できました!
0063login:Penguin
2010/03/16(火) 14:08:38ID:hRXCRI1Igawk '{print $1;}' data.txt
ていうのは、クォーテーションはダブルにしないといけないんですね。。。
0064login:Penguin
2010/03/16(火) 14:27:11ID:OV90ZKd/cmd.exe の仕様の問題であって、awk の側では対応しようにもできない。
0065login:Penguin
2010/05/14(金) 13:36:36ID:XjQaHos9printf "256倍のコードが提供されてる\n"
printf "ttp://books.ascii.jp にアクセス\n"
printf "本には4756101623なんてのがついてるけど、本の通りに入れるとnot found\n"
}
END {
print "昔と本の内容が変わってるみたいだな"
}
0066login:Penguin
2010/05/14(金) 21:49:15ID:KfNsslphprint "まだ始まってもねーよっ!"
}
BEGIN {
printf "・・・ごめ・・・\n"
}
0067login:Penguin
2010/07/22(木) 10:04:21ID:PFu3TuWNif ($0 == "aka") print "red"
else print "blue"
}
の最も変態的な記法を教えて下さい。
0068login:Penguin
2010/07/22(木) 10:29:55ID:YKIn4IAK0069login:Penguin
2010/07/28(水) 10:04:53ID:ZsEEtYoLsystem("echo " + $0 + " | perl -ne 'if(/"aka"/){print \"red\";}else{print \"blue\";}'")
}
0070初心者
2010/11/04(木) 22:16:05ID:UUOsCvwdperlだと##で行けますが
0071login:Penguin
2010/11/04(木) 23:15:07ID:mFaq3KZr0072初心者
2010/11/05(金) 06:33:50ID:HLS9uc8iマルチがだめとは知りませんでした。
0073login:Penguin
2011/02/03(木) 07:43:56ID:S25iv8qF0074login:Penguin
2011/02/11(金) 03:51:35ID:9907NRVaAWK Users JP :: OSC2011 Kagawa 特設サイト
http://gauc.no-ip.org/awk-users-jp/blis.cgi/OSC2011_Kagawa
0075login:Penguin
2011/02/11(金) 21:58:36ID:W6G44msPだせぇ・・・
とか思ってたらこんなのもあるんだな。
http://awk.info/?doc/dsl/awkplusplus.html
0076login:Penguin
2011/05/24(火) 19:21:38.77ID:iwctpm7Oスペースで区切られたテキストファイルがあります。
例(フィールド数も文字数も全部異なります)
abc efg hij http://www.example.com/index.html xyz
123 http://www.example.org/ she good love look good
4edi http://www.example.net/test/test.html
こんな感じのテキストファイルからURLだけを抽出したい
場合、どう言った処理を行うと良いでしょうか?
printなどは使えそうにないし頭を抱えています。
是非お助け下さい。
0077login:Penguin
2011/05/24(火) 19:44:33.96ID:Z14Fpx2c{for(i=0;i<=NF;i++)if($i ~ /^http:\/\/.+$/)print $i}
0078login:Penguin
2011/05/24(火) 19:52:09.13ID:WxByEtFQmatch($0, /http:\/\/[^ ]+/, f)
を使う気がする。
0079login:Penguin
2011/05/24(火) 20:22:38.00ID:jzDVjDvhcat 入力ファイル | tr ' \t' '\n' | awk '/^http:/'
…まで書きかけて、あれ、これawkじゃなくてgrepで良くね、と思ってしまった俺
0080login:Penguin
2011/05/24(火) 20:49:07.88ID:WxByEtFQexpr 文字列 : '.*\(http:\/\/[^ ]*\).*'
を使う気がする。
0081login:Penguin
2011/05/24(火) 23:22:37.43ID:Rb7jhN0uでも、処理内容がそれだけなら sed -n 's/^.*\(http:[^ ]*\).*$/\1/p' だなぁ
避けられるなら正規表現は避けたほうが速いんじゃないかと思ってる
008276
2011/05/25(水) 00:02:32.97ID:bOPlpFb7一つ一つひもといて自分のものにしていきたいです。
みなさん本当に色々ありがとうございます。
0083login:Penguin
2011/05/25(水) 02:29:57.15ID:RCLD3Ghq0084login:Penguin
2011/05/25(水) 03:14:46.21ID:zyb8WUrOawk以外でならperl、さもなくばrubyあたりまでが俺は限度だなあ
0085login:Penguin
2011/05/27(金) 01:08:18.13ID:4uJpaTLSとか
0086login:Penguin
2011/06/02(木) 03:19:02.91ID:LRv8LU2qawk '{ l[i++]=$0 }; END{ srand(); print l[int(i*rand())] }'
シェルスクリプトの方が短いか?
0087login:Penguin
2011/06/02(木) 09:37:16.89ID:Z7QDCEkgBEGIN { srand() }
rand() * NR < 1 { x = $0 }
END { print x }
0088login:Penguin
2011/06/02(木) 20:42:21.58ID:ud/fx+Pyそれだと行数が多いと後半の表示が少なくなっちゃう
0089login:Penguin
2011/06/02(木) 21:02:20.14ID:Z7QDCEkg2行のときは
1/1の確率で1行目が選ばれる
→1/2%の確率で2行目が選ばれる
3行のときは
1/1の確率で1行目が選ばれる
→1/2の確率で2行目が選ばれる(この時点で1行目、2行目の確率はともに1/2)
→1/3の確率で3行目が選ばれる(2/3の確率で1or2行目が残り両者1/2なので全て1/3)
のように、基本的に確率は等しいはずですが……
浮動小数点演算の精度が問題になるような行数の話でしょうか?
009086
2011/06/02(木) 22:17:12.88ID:jvZfUiPLお、これはすごい!考えたなー。ぱっと思いついた奴は、天才だ。こんな風になりたいわ。
> 浮動小数点演算の精度が問題になるような行数の話でしょうか?
これは初め見たとき思ったけど、それが問題になるなら、
私の書いた方法でもメモリが逼迫してまずい気がします。
ただ、精度やrand()の性能で、実際に統計取ったら88の言うようになるのかもしれません。
あとは、rand()が1を返す実装はないよね?gawkのマニュアル読んで書くのだけど、
関数の説明が簡単に書き過ぎていて、ちょっと不安。
0091login:Penguin
2011/06/02(木) 22:37:43.51ID:jvZfUiPLmawkだとsrand()を省けるから、もっと短い。エレガント!
それにしても、4ヶ月ぶりに上がったんだ。ほんと人居ない。
0092login:Penguin
2011/06/02(木) 22:45:23.28ID:twwaY/QA0093login:Penguin
2011/06/03(金) 00:28:36.43ID:lUf7A9Qj0094login:Penguin
2011/06/03(金) 00:49:49.88ID:cydHNqeK0095login:Penguin
2011/06/03(金) 01:07:11.81ID:cydHNqeKawk 1 RS=
sedだと、
sed /^$/d
かな?同じ9文字か。
0096login:Penguin
2011/06/03(金) 09:20:27.26ID:5n/j2qmPrand()を全行で実行しているから、
1行目には2行目以降が x を上書きする確率が加わり、
2行目には3行目以降が x を上書きする確率が加わり、
ってことになるんじゃないのかな。
全4行の場合
1行目が表示される確率 1/1*1/2*1/3*1/4
2行目が表示される確率 1/2*1/3*1/4
3行目が表示される確率 1/3*1/4
4行目が表示される確率 1/4
って感じで、最終行が表示される確率が一番大きい気かします。
rand()をBEGINの中に入れてしまえば全部同じだけど。
0097login:Penguin
2011/06/03(金) 09:45:41.12ID:TAmMFFcQ1/1*1/2*1/3*1/4 + 1/2*1/3*1/4 + 1/3*1/4 + 1/4 = 5/12 (≠ 1)
なので、それが誤りなのは、すぐに分かるはずですが……
それらの確率を足したら1になっていないといけません
ここは高校数学の確率統計のお話をするスレではありませんが、
以下のように考えたらお分かりでしょうか?
1行目が表示される確率は 1/1*1/2*2/3*3/4 = 1/4
(1行目が選ばれる確率 * 2行目が選ばれない確率 * 3行目が選ばれない確率 * 4行目が選ばれない確率)
2行目が表示される確率は 1/2*2/3*3/4 = 1/4
(2行目が選ばれる確率 * 3行目が選ばれない確率 * 4行目が選ばれない確率)
3行目が表示される確率は 1/3*3/4 = 1/4
(3行目が選ばれる確率 * 4行目が選ばれない確率)
4行目が表示される確率は 1/4
(4行目が選ばれる確率)
0098login:Penguin
2011/06/03(金) 12:56:40.94ID:yy0ffQt3そうでした。電車の中で気が付きました。
x が上書きされる確率じゃなくて、上書きされない確率を掛けないといけませんでした。
納得。
0099login:Penguin
2011/06/03(金) 22:11:19.49ID:cydHNqeKtar xf linux-2.6.39.1.tar.bz2 --wildcards '*.c' -O >src.txt
time cat src.txt |awk 1 RS= >/dev/null
real 0m3.172s
user 0m2.786s
sys 0m0.757s
time cat src.txt |sed /^$/d >/dev/null
real 0m32.503s
user 0m31.465s
sys 0m0.882s
※参考
time cat src.txt |cat >/dev/null
real 0m0.606s
user 0m0.036s
sys 0m0.586s
おー。sedより、ずっとはやーい
やったね、awk!
0100login:Penguin
2011/06/03(金) 22:26:22.52ID:lSuFEE/Z0101login:Penguin
2011/06/04(土) 12:42:54.20ID:HzZByxDXawk -Fm '{ a[$1]+=$2; a[0,$1]++ }; END{ for(i in a) if(i~/^[rus]/) printf "%sm%.3fs\n",i,a[i]/a[0,i] }'
昨日の時間計測のために書いた。
いろいろ問題あり。これ以上短くかけなかった、残念だわ。
sedがすっごい遅いので全部メモリに読み込んで処理させてみた。
time cat src.txt |sed -n '1x;1!H;${x;s/\n\n\+/\n/gp}' >/dev/null
real 0m24.515s
user 0m18.584s
sys 0m2.005s
# ちなみに、昨日のも含めて3回試した結果を平均した
…やっぱ遅い。GNU sedが悪いの?スレ的に満足な結果だけど。
便利で速くてシンプルなのに、あまり使われない紹介されない、消え行くawk、カワイソス
0102login:Penguin
2011/06/04(土) 13:21:18.28ID:El9DLlK0perl -pae'$_=$F[8].$/'
ruby -nae'puts$F[8]'
awk 'print$9'
0103login:Penguin
2011/06/05(日) 00:51:57.16ID:kp3qNbsCこのスレの住民にはこれくらい当たり前なのか…
0104login:Penguin
2011/06/05(日) 05:45:10.75ID:jNueNt7Q1番目の引数である「1」は「パターンは常に成り立つ、アクションは指定しない(=レコードを加工せずに出力)」というawkコードだろうけど
その次の引数って入力ファイルになるはずじゃ?
0105login:Penguin
2011/06/05(日) 07:57:57.27ID:k4Gl3aKkgawk 1 RS= testfile.txt
0106login:Penguin
2011/06/05(日) 08:10:41.12ID:SucWQMoo0107login:Penguin
2011/06/05(日) 08:50:42.42ID:jNueNt7Qコードは1で終わってね?
0108login:Penguin
2011/06/05(日) 09:34:08.07ID:jNueNt7Q0109login:Penguin
2011/06/05(日) 09:55:54.81ID:Tq0aYVo2一応説明すると、プログラム自体は>>104の解釈の通りです。
また、RS=""なら、RS="\n\n+"とほぼ同じです。
違いは、RS=""はファイルの先頭に改行が続くとき、それを無視します。
ついでに、POSIXではRSに2文字以上設定すると、結果は不定とされています。
gawkでは、正規表現を使える拡張がされていますけど。
引数ですが、ここに代入文を書くとBEGINの後に処理されます。
まあ、ああ書いたのは-vオプションを使うと3文字コマンドが増えるからなんですが、
こういう変数の設定方法もあるということで。
0110login:Penguin
2011/06/05(日) 10:44:14.22ID:3GXVErWFの7文字だけでOK
RSは初期値が入ってるんだから
0111login:Penguin
2011/06/05(日) 14:48:51.10ID:jNueNt7Q0112login:Penguin
2011/06/05(日) 19:30:13.18ID:Tq0aYVo2書き忘れ。
RS=""のとき、ファイルの末尾の改行も無視する。
あと、FSが"\n"に設定されているように振舞う。
元々複数行を一気に処理したい場合に使うことを想定してたのだろう。
>>110
ああ、すごい、これは短い!頭柔らかいねえ、スマートだわ。
夢の中でも考えたのに…無能過ぎワラタ
>>111
grep最強伝説はっじまっ…らないぞ。同じ方法で時間計測したら2時間半たっても終わらない。
grep捨ててawkを使おう!
0113login:Penguin
2011/06/05(日) 20:13:50.57ID:k4Gl3aKk0114login:Penguin
2011/06/07(火) 23:28:39.30ID:pixJYa/Gawk '{ print $0 "\r" }'
こっちの方が速くて短いか。
awk 1 ORS='\r\n'
0115login:Penguin
2011/06/08(水) 00:28:22.25ID:AGBbsX8a0116login:Penguin
2011/06/08(水) 01:01:03.76ID:48mfCmU6下のは、awkがどう動くかを知ってないと気持ち悪い感じ。
101みたいなsedスクリプトを、初めて見たときのような。
0117login:Penguin
2011/06/08(水) 06:42:33.45ID:3juXEiESCRLFの\r\nとは違うから
Windowsでは認識しないのでは?
0118login:Penguin
2011/06/08(水) 12:16:04.61ID:AGBbsX8aいや、上のコードは\rが先に出力されるからあってるよ、改行じゃなくて普通の可読文字でためしてみ
0119login:Penguin
2011/06/09(木) 23:01:35.59ID:b4gs0WW2awk 1 RS=\\r ORS=
改行弄ったら戻したいよね。一文字多い別解。
awk 'sub(/\r/,"")'
>>117
$0にRSは含まれない。print文での出力のときにORSが付けられる。
だから、114のような書き方ができるのです。
え?素直にnkfとかtr使うべきだって?ごめんちゃい。
tr -d \\r
nkf -d
短いねえ…そして速そう…
0120login:Penguin
2011/06/12(日) 23:20:31.21ID:8N8UbY4vawk 'gsub(/foo/,"bar")'
sedで書くとこうか。
sed -n 's/foo/bar/gp'
こういう処理はsedの方が楽に書けるのかな、うーん。
>>119
awk 'sub(/\r/,"")+1'
下はこの方が良かった。うっかりファイルの内容を消してしまいそうだ。
0121login:Penguin
2011/06/13(月) 19:11:34.42ID:NkVjy07h逆にそれ以外のツールでもスクリプトでもなく、awkで書きたくなるのはフィールドを使うものかな
0122login:Penguin
2011/06/13(月) 22:57:31.80ID:0YRj9/YK0123login:Penguin
2011/06/14(火) 21:28:05.61ID:ODOs6IfG置換はsedとかtr
結合はcatとかpaste
計算はexprとか場合によりwc
多少組み合わせる必要があるならshでシェルスクリプトwhile、for、read、shiftみたいな
大抵やりたいことに対応するコマンドがある。awkでプログラム風に書くのは人を選ぶのかもね。
このスレが太古の昔に沈んでしまったのも、そのせいか。
実際、プログラム板にもあるけど、あちらはそこそこ書き込みがある。
Linuxも既にGUI全盛、バッチ処理もGUIでという流れか、シェルスクリプト総合スレもなくなってしまったし。
板全体がほとんど動作報告中心になって、Linuxやシステム全体のコアな部分、プログラミングの話題を
話す場所が消えてしまったような気がする。気がするだけ。
0124login:Penguin
2011/06/14(火) 23:04:41.82ID:CILjaNiqLinuxでメジャーなシェルは大概BSDとかでも使えるし
0125login:Penguin
2011/06/15(水) 21:26:33.76ID:QLTzRiMxawk '/<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板のシェルスクリプトスレまで無くなってやがる…
0126login:Penguin
2011/06/15(水) 22:50:13.28ID:QFQ0PbYI0127login:Penguin
2011/06/16(木) 00:11:48.62ID:oqM9OV4C0128login:Penguin
2011/06/16(木) 00:29:05.98ID:G4IIl/GQスレ建てた事無いから分からないけど、最近建て難いようだし、そのせいかな。
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を必要とするときくらいしか、使うべきじゃない。
# 一つのケースでしかないのだけどね。ただ、これほど遅いとは…
0129login:Penguin
2011/06/16(木) 09:39:38.00ID:iftKRWTEそれ、xgawkで書くとどんなになるの?
0130login:Penguin
2011/06/16(木) 10:18:36.69ID:x2P5GNsYgawk '$0=gensub("</?title>", "", "g", RT)' RS='<title>.*</title>' IGNORECASE=1
0131login:Penguin
2011/06/19(日) 18:13:12.21ID:O1oYVV5e待てよ…awkでもパターン検索だけなら遜色なく書けて
かつawkのが速いんじゃ、grepの存在価値って…
ああ、複数ファイルからの検索があるか
つーても、これもawkでFILENAMEとFNR明示したら書けちゃうか…
0132login:Penguin
2011/06/20(月) 00:28:57.29ID:rO0fE487まあgrepで済む物は記述が簡単なわけで。
0133login:Penguin
2011/07/01(金) 01:20:48.84ID:NsJJwAAV>>130
おー!これはクール。
gawkは大文字小文字無視する処理書くの楽だね。流石だ。
>>131
前後の行を表示させたりが楽かも。まあ、滅多にお世話になることないけど…
rm -r *でデータ飛ばしたから、そのサルベージに役立つとは…orz
0134login:Penguin
2011/07/01(金) 02:00:56.40ID:NsJJwAAVawk '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に整形版を置いておきます。
ttp://pastebin.com/PJ2VfqN4
0135login:Penguin
2011/07/01(金) 23:56:01.08ID:NsJJwAAVtime 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倍くらい遅いか。ネイティブとスクリプトだから、まあこうなる、と言ったところだと思う。
短い処理なら有利な場合もあるんだろうけど。
0136login:Penguin
2011/07/04(月) 00:51:55.26ID:Zh/tRXtGawk 'f!=FILENAME && /regex/{ print f=FILENAME }'
gawkならこう書ける。
awk '/regex/{ print FILENAME; nextfile }'
>>131に近い。FNRも使って検索結果を表示するスクリプトも、あまり複雑にはならなそう。
下の方が速いけど、mawkだとnextfileをサポートしてなかった。
grep -lと同じ結果で、指定する正規表現によってawkの方が速く動くこともあるよ。
0137login:Penguin
2011/07/05(火) 00:27:00.04ID:iZUKjs1Phttp://sourceforge.jp/magazine/11/07/04/0459223
0138login:Penguin
2011/07/06(水) 07:36:41.51ID:Q5KmFo/I0139login:Penguin
2011/07/07(木) 02:54:29.78ID:bHkfWT8Rawk '{ 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で表示してやってるなぁ。
0140login:Penguin
2011/07/07(木) 11:14:47.64ID:WpiH6Omg0141login:Penguin
2011/07/08(金) 00:37:18.45ID:gfdD9pMCawk '{ 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でデバッガが重宝するような長いスクリプトって、どれほど書かれてるんだろう?
■ このスレッドは過去ログ倉庫に格納されています