awkについて語るスレ $2

このエントリーをはてなブックマークに追加
714デフォルトの名無しさん:2012/12/13(木) 11:40:43.98
awkにかわる同等のものあります?
715デフォルトの名無しさん:2012/12/13(木) 13:08:08.26
python
716デフォルトの名無しさん:2012/12/13(木) 13:13:55.85
>>715
awkみたいに使い勝手いいのかな?
717デフォルトの名無しさん:2012/12/13(木) 13:18:24.65
良いですよ
718デフォルトの名無しさん:2012/12/13(木) 13:24:31.23
>>717
ありがとす。勉強してみます
719デフォルトの名無しさん:2012/12/13(木) 14:45:25.45
はい
720デフォルトの名無しさん:2013/02/06(水) 03:49:18.86
“任意の記号”を含んだシェル変数を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自体は渡されているはずですが、何が原因でしょうか?
721デフォルトの名無しさん:2013/02/06(水) 11:23:41.42
>>720
いちぎょうめのひだりがわの var は、ひょうかのさいに
せいきひょうげんへのかたへんかんがおこなわれる。

$0 ~ /hoge$fuga/ {print "hoge$fuga"}
END {print "hoge$fuga"}

めたもじとなってしまうものは、じぜんあるいはこーどのなかで
えすけーぷするひつようがある。
722デフォルトの名無しさん:2013/02/06(水) 11:29:22.31
~(チルダ)の右辺は正規表現として解釈されるから、"hoge" ~ /hoge$fuga/ でマッチするわけがない。
逆に寧ろ、"hoge$fuga" ~ /hoge/ ならマッチする。
723デフォルトの名無しさん:2013/02/06(水) 11:33:09.61
>>720
>721も>722もどちらも原因。やりたいことをよく整理しよう。
724720:2013/02/06(水) 15:09:21.72
すいません、echo "hoge"ではなくecho "$var"でした。
ただ、結果は>>720と同じです。

要は入力ファイル内の「メタ文字込みの任意の文字列」を、別の「メタ文字と改行込みの任意の文字列」で置換する、
というのをメタ文字のエスケープ等の面倒な処理をせずにサクッとやりたいのですが、できますか?
725デフォルトの名無しさん:2013/02/07(木) 05:01:43.19
ムリ

予め「メタ文字と言っても $ しか出てこない」とか判ってるなら大したこと無いけど
一般化すればするほど面倒になる
726720:2013/02/07(木) 22:14:56.21
>>725
やはりそうですか。
今までこういった処理はsedでしこしこエスケープしてやってたんですが、いい加減面倒になったので、
たとえばfgrepみたいに正規表現をオフにして処理する方法はないかと探しているんですが、
awkでは無理ですか・・・。
727デフォルトの名無しさん:2013/02/08(金) 11:20:14.98
>>726
単に一致なら正規表現なんか使わずに比較すればいいじゃん。
fgrepで事が足りるのならawkからfgrepを起動すればいいじゃん。
728デフォルトの名無しさん:2013/02/08(金) 19:27:47.04
>>726
fgrepなら index()関数じゃないの?
729720: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文でやりゃいいんじゃないの。
731デフォルトの名無しさん:2013/02/09(土) 21:34:09.39
>>729
文字列の比較は等号でできるって認識はないの?
732デフォルトの名無しさん:2013/02/10(日) 14:31:49.57
>729
いや、その方法でも結局 ' はエスケープが必要でしょ。
ダイレクトにシェル変数に入れる方法か、
ファイルなどに吐き出しておく方法の方が安定。
まぁそれでも改行とか制御文字入れられるともにょる場合があるけどな。
733デフォルトの名無しさん:2013/02/11(月) 20:15:01.17
そこまでめんどくさくなったらperlとかrubyとか使った方が楽だぞw
734デフォルトの名無しさん:2013/02/11(月) 22:46:25.57
何で gawk -f とか使わずワンライナーに拘るのかねぇ
735デフォルトの名無しさん:2013/02/12(火) 22:00:38.07
>>732
中韓ファイルを作るのは情弱の仕事(ドヤ顔
>>734
ワンライナーディスってんの?
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>")
}
739UNIX(LF) to DOS(CR+LF) conversion:2013/03/21(木) 21:15:00.86
awk 1 infile1 > outfile2.txt
740デフォルトの名無しさん:2013/03/21(木) 22:10:08.07
# 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
}
741デフォルトの名無しさん:2013/03/21(木) 22:11:11.39
# >>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
}
742デフォルトの名無しさん:2013/03/21(木) 22:12:57.08
function produce_string(a, size, g, i) {
743grepを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)}
744デフォルトの名無しさん:2013/11/30(土) 12:16:25.95
$ echo 10 20 30 | awk '{for(i=0;i<4;)print _$++i}'
10
20
30

_$++iでも$++iでもどちらでもいけるのですが、アンダースコアが付いて何故大丈夫なのでしょうか?
745デフォルトの名無しさん:2013/11/30(土) 16:04:55.55
すいません、わかりました
空の変数_と$++iの結果が一緒になってただけなんですね
746デフォルトの名無しさん:2013/11/30(土) 20:37:58.81
単に式を並べると文字列連結になる、の罠か
747デフォルトの名無しさん:2014/04/02(水) 00:10:13.15 ID:T3/5Epfc
保守

てか半年近く書き込みが無かったか
748デフォルトの名無しさん:2014/04/14(月) 22:41:42.89 ID:5r697USd
4.1.1ってもうリリースされたの?
749デフォルトの名無しさん:2014/04/19(土) 13:45:38.45 ID:Db2IzPol
とあるgawkスクリプトの先頭で
{last_hoge=hoge; hoge=$ 3}
ってやってるんだけど、
hoge=$ 3はhoge=$3の間違い? それともこういう記法がある?
750デフォルトの名無しさん:2014/04/19(土) 14:56:08.53 ID:A73fEYrr
>>749
$ は演算子だから、a=b+1をa = b + 1と書くようなものかな。
751デフォルトの名無しさん:2014/04/19(土) 21:10:32.64 ID:Db2IzPol
ええー 演算子だったのかあ。衝撃の事実
752デフォルトの名無しさん:2014/04/20(日) 12:36:45.70 ID:SQaIR8ej
演算子だから、変数でもいいよ。
753デフォルトの名無しさん:2014/04/20(日) 14:34:12.09 ID:YSeiuWKu
式が書けるね。
$ は一番優先順位が高いから、かっこで括らにゃいかんが。
754デフォルトの名無しさん:2014/04/20(日) 15:12:13.25 ID:k3tDznaJ
今はじめて知った。haskellの$は演算子だって知ってたけど、awkでも演算子だったんだね。
755デフォルトの名無しさん:2014/10/14(火) 13:37:28.35 ID:cBz5RbAX
そして半年近く書き込みが無かった
756デフォルトの名無しさん:2014/10/15(水) 03:28:03.90 ID:SS4U/DMU
いやawkスレなんて普段はそんなに話題ないだろ
757デフォルトの名無しさん:2014/10/21(火) 15:46:10.36 ID:TQsAGJgk
質問させてください

今ディレクトリ内のファイルの名称とサイズのリストを作りたいと思っています
コマンドとしてはls -lを実行していますがこれをさらにawkにパイプしています
ただしファイル名にスペースが含まれているため以下のような苦肉の策をとっておりますが

ls -l | awk '{print $5 "\t" $9$10$11$12$13$14$15$16$17$18$19}'

10個以上で区切られてる可能性もあるため根本的な対応をしたいと考えていますが
よい案はありますでしょうか
758デフォルトの名無しさん:2014/10/21(火) 17:25:55.68 ID:EsuQiv22
# ファイル名に「"」が含まれていたら知らね。
ls -Ql |awk '{split($0, foo, "\x22"); print $5 "\t" foo[2]}'
759デフォルトの名無しさん:2014/10/21(火) 23:41:50.65 ID:stXOK2Vv
Qオプションは勉強になった
ls -l|awk '{s=$5;for(i=1;i<9;i++)$i="";print s"\t"$0}'
760名無しさん@そうだ選挙に行こう:2014/12/13(土) 17:07:55.12 ID:8LbgKkKk
¥034  は ” (半角)
¥035  は # (半角)       でおkですか?
761名無しさん@そうだ選挙に行こう:2014/12/13(土) 18:17:16.35 ID:FQOeA8KF
>>760
いいえ違います。
762デフォルトの名無しさん:2014/12/14(日) 00:00:31.34 ID:7YfznIJB
どちらも非可読文字ですね。そしてそうなるとスレ違い。
awkと絡むのなら具体的にどうぞ。
763デフォルトの名無しさん
Terastationのファイル・ホルダ名に使うとファイルレプリケーションでエラーが起こる文字があって、それを変換するバッチを生成する時にこのマイナー言語が大活躍した。
約80万件のファイルホルダ名から抽出するのに10分程度だった。