awkにかわる同等のものあります?
python
良いですよ
はい
“任意の記号”を含んだシェル変数をawkに渡すことは可能ですか?たとえば
[user@localhost ~]$ var='hoge'
[user@localhost ~]$ echo "hoge" | awk -v var="$var" '
$0 ~ var {print var}
END {print var}
'
hoge
hoge
ここで、varに$を含ませると
[user@localhost ~]$ var='hoge$fuga'
[user@localhost ~]$ echo "hoge" | awk -v var="$var" '
$0 ~ var {print var}
END {print var}
'
hoge$fuga
とうまくマッチしませんでした。var自体は渡されているはずですが、何が原因でしょうか?
>>720 いちぎょうめのひだりがわの var は、ひょうかのさいに
せいきひょうげんへのかたへんかんがおこなわれる。
$0 ~ /hoge$fuga/ {print "hoge$fuga"}
END {print "hoge$fuga"}
めたもじとなってしまうものは、じぜんあるいはこーどのなかで
えすけーぷするひつようがある。
~(チルダ)の右辺は正規表現として解釈されるから、"hoge" ~ /hoge$fuga/ でマッチするわけがない。
逆に寧ろ、"hoge$fuga" ~ /hoge/ ならマッチする。
>>720 >721も>722もどちらも原因。やりたいことをよく整理しよう。
724 :
720:2013/02/06(水) 15:09:21.72
すいません、echo "hoge"ではなくecho "$var"でした。
ただ、結果は
>>720と同じです。
要は入力ファイル内の「メタ文字込みの任意の文字列」を、別の「メタ文字と改行込みの任意の文字列」で置換する、
というのをメタ文字のエスケープ等の面倒な処理をせずにサクッとやりたいのですが、できますか?
ムリ
予め「メタ文字と言っても $ しか出てこない」とか判ってるなら大したこと無いけど
一般化すればするほど面倒になる
726 :
720:2013/02/07(木) 22:14:56.21
>>725 やはりそうですか。
今までこういった処理はsedでしこしこエスケープしてやってたんですが、いい加減面倒になったので、
たとえばfgrepみたいに正規表現をオフにして処理する方法はないかと探しているんですが、
awkでは無理ですか・・・。
>>726 単に一致なら正規表現なんか使わずに比較すればいいじゃん。
fgrepで事が足りるのならawkからfgrepを起動すればいいじゃん。
>>726 fgrepなら index()関数じゃないの?
729 :
720:2013/02/09(土) 15:32:27.55
>>727 >単に一致なら正規表現なんか使わずに比較すればいいじゃん。
意味が分からないんですが、awk上の話ですよね?
>>728 index()の引数は文字列だから、これをうまく使えば目的の処理ができる・・・のかな?
でもなんかawkでごちょごちょやるより、メタ文字をエスケープする前処理をかますなり
何なりしたほうが素直な気がしてきた・・・。たとえばこんな感じで
$ var='hoge$fuga'
$ var2=$( echo "$var" | sed 's/\$/\\\\$/g' ) ←エスケープ処理
$ echo "$var" | awk -v var="$var2" '
$0 ~ var {print var}
END {print var}
'
hoge\$fuga
hoge\$fuga
730 :
デフォルトの名無しさん:2013/02/09(土) 17:49:52.25
/bin/shでごちょごちょやるのが好みなら、awkもfgrepも使わず、case文でやりゃいいんじゃないの。
>>729 文字列の比較は等号でできるって認識はないの?
>729
いや、その方法でも結局 ' はエスケープが必要でしょ。
ダイレクトにシェル変数に入れる方法か、
ファイルなどに吐き出しておく方法の方が安定。
まぁそれでも改行とか制御文字入れられるともにょる場合があるけどな。
そこまでめんどくさくなったらperlとかrubyとか使った方が楽だぞw
何で gawk -f とか使わずワンライナーに拘るのかねぇ
736 :
デフォルトの名無しさん:2013/03/11(月) 10:05:12.56
#
# text converter ( Mac to MS-DOS on Windos/MS-DOS machine)
# convert CR to CR+LF
#
BEGIN{ RS = "\r" }
{ print }
737 :
デフォルトの名無しさん:2013/03/15(金) 08:05:25.28
#
# Line(行数)を数える
#
END { FNR }
738 :
デフォルトの名無しさん:2013/03/20(水) 19:07:17.00
# text to html converter
# usage: awk -f txt2htm.awk infile1.txt > outfile2.html
BEGIN{
print("<html>"); print("<head>")
print("<titile> My favorite URLs </titile>")
print("</head>"); print("<h1> </h1>"); print("<body>");
}
/^[:space:]*http/ { print "<A HREF=\""$1"\">"$1"</A><BR>"}
END{
print("</body>")
print("</html>")
}
739 :
UNIX(LF) to DOS(CR+LF) conversion:2013/03/21(木) 21:15:00.86
awk 1 infile1 > outfile2.txt
# awk -f add.awk
BEGIN {
s1 = "323524855"
s2 = "4972560"
reverse(a2, s2)
size = reverse(a1, s1) # s1 > s2
carry = 0
for(k = 1; k <= size; k++) { # s1 > s2
d = a1[k] + a2[k] + carry
if(d >= 10) {
e[k] = d - 10
carry = 1
} else {
e[k] = d
carry = 0
}
}
if(carry == 1) {
e[k] = 1
size = k
}
g = produce_string(e, size)
printf("%s + %s = %s\n", s1, s2, g)
printf("%f\n", s1 + s2)
exit
}
#
>>740のつづき
function reverse(a, s, k, i) {
k = 1;
size = length(s)
for(i = size; i >= 1; i--) {
a[k++] = substr(s, i, 1)
}
return size
}
function produce_string(a, size, i) {
g = ""
for(i = size; i >= 1; i--) {
g = g a[i]
}
return g
}
function produce_string(a, size, g, i) {
743 :
grepをawkで:2013/03/22(金) 13:32:02.74
# usage: awk -f grep.awk char1 file1 file2
BEGIN{
pattern = ARGV[1]
ARGV[1] = ""
}
$0 ~ pattern {print($0" File name=" FILENAME)}
$ echo 10 20 30 | awk '{for(i=0;i<4;)print _$++i}'
10
20
30
_$++iでも$++iでもどちらでもいけるのですが、アンダースコアが付いて何故大丈夫なのでしょうか?
すいません、わかりました
空の変数_と$++iの結果が一緒になってただけなんですね
単に式を並べると文字列連結になる、の罠か
保守
てか半年近く書き込みが無かったか
4.1.1ってもうリリースされたの?
とあるgawkスクリプトの先頭で
{last_hoge=hoge; hoge=$ 3}
ってやってるんだけど、
hoge=$ 3はhoge=$3の間違い? それともこういう記法がある?
>>749 $ は演算子だから、a=b+1をa = b + 1と書くようなものかな。
ええー 演算子だったのかあ。衝撃の事実
演算子だから、変数でもいいよ。
式が書けるね。
$ は一番優先順位が高いから、かっこで括らにゃいかんが。
今はじめて知った。haskellの$は演算子だって知ってたけど、awkでも演算子だったんだね。
そして半年近く書き込みが無かった
いやawkスレなんて普段はそんなに話題ないだろ
質問させてください
今ディレクトリ内のファイルの名称とサイズのリストを作りたいと思っています
コマンドとしてはls -lを実行していますがこれをさらにawkにパイプしています
ただしファイル名にスペースが含まれているため以下のような苦肉の策をとっておりますが
ls -l | awk '{print $5 "\t" $9$10$11$12$13$14$15$16$17$18$19}'
10個以上で区切られてる可能性もあるため根本的な対応をしたいと考えていますが
よい案はありますでしょうか
# ファイル名に「"」が含まれていたら知らね。
ls -Ql |awk '{split($0, foo, "\x22"); print $5 "\t" foo[2]}'
Qオプションは勉強になった
ls -l|awk '{s=$5;for(i=1;i<9;i++)$i="";print s"\t"$0}'
¥034 は ” (半角)
¥035 は # (半角) でおkですか?
どちらも非可読文字ですね。そしてそうなるとスレ違い。
awkと絡むのなら具体的にどうぞ。
Terastationのファイル・ホルダ名に使うとファイルレプリケーションでエラーが起こる文字があって、それを変換するバッチを生成する時にこのマイナー言語が大活躍した。
約80万件のファイルホルダ名から抽出するのに10分程度だった。