• ベストアンサー

awk と gawk の書き方の違い

PCでAWKコマンドを使いたくてgawkを使ってみたのですが、 やっぱりawkのような書き方では上手く実行できないみたいです。 gawkのバージョンは v3.1.6です。 コマンド (awk) awk -F, '{printf("copy aaa\%s bbb\%sn",$0,$0)}' list.txt 単純にDOSのバッチをファイルから作りたいだけなのですが・・・gawkではどのように書けば良いのか教えてください。お願いします。 仕事でUNIXを使っていたのですがPCに移行するという話がでていて、今までのunixコマンドをPCで動くようにソースを書き直して行かなくてはならないのにパスを『/』から『\』にしただけでは全く動きませんでした。やっぱりUNIXのawkでは出来てPCのgawkでは出来ないこともあるのでしょうか?それとも書き方の問題でしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • Fushino
  • ベストアンサー率59% (329/550)
回答No.1

>やっぱりawkのような書き方では上手く実行できないみたいです。 エラー箇所と内容を返してくると思いますが具体的にどういう状況でしょうか。 単純に引用符の問題だけのように思えますが↓でどうでしょう。 ※一部単純な誤記と思われる部分(\→\\、n→\n)も変更しました。 gawk -F, "{printf(\"copy aaa\\%s bbb\\%s\n\",$0,$0)}" list.txt

kariyu1231
質問者

お礼

本当でした。\を付けると上手くながれました。 printf(のあとの"にも\がいるとは思いませんでした。 有難うございました。

その他の回答 (2)

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.3

こんにちは。 cmd.exe の引用符は " とヘルプに記載されています。' は使用できなかったのでは?? 引用符の説明は、cmd.exe /? リターンとしてみてください。簡単な解説が表示されます。あるいは『コマンドプロンプト 引用符』『cmd.exe 引用符』を検索語に設定してググってみるとよいです。 ただ、bash(1) の QUOTING の仕様と cmd.exe はずいぶん異なります。その仕様差異を吸収するアプローチは、すでに回答が寄せられている Awk ファイルへのプログラムの配置変更を回答者もおすすめします。ま、とはいえ、例示スクリプトの内容であれば ', " を手直しすれば One-liner でも問題ないと思います。実際、回答者も日常このような書き捨てプログラムを書いていますから。慣れれば指が勝手にエスケープしてくれるようになります。 C:\tmp2\tool\UBTrek>gawk "/[dD][eE][fF]_[dD][lL][lL]/ { $1 = \"\"; print }" *.uws lib\*.uws | gawk "{ match($1, /^([a-zA-Z0-9_])+/, arr); print arr[0];}" | gawk "{ Arr[$1]++ } END { for (i in Arr) { print i \"\t\" Arr[i] }}" | gawk "{ Arr[FNR] = $0 } END { asort(Arr); for (i = 1; i <= length(Arr); i++) { print Arr[i] }}" | gawk "{ print NR, $0 }" > result.txt && result.txt

kariyu1231
質問者

お礼

すごいですね!こんなに長いのも1行で書くことが出来るのですね!! 恐れ入りました。gawk自体は何の問題も無かったみたいですね。 ありがとうございます。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

gawkとawkの違いではないですね。"・・・" の中に \ を書くときは \\ と書く必要があります。 またこのコマンドはバッチファイルに書くかコマンドプロンプトからの実行でしょうが、バッチを処理するCMD.EXEは " をうまく扱えないので、直接書かずにgawkスクリプトは別ファイルに書いた方が良いです。 この程度だと直接書いても大丈夫ですが、ちょっと複雑になると駄目です。 aaaa.bat =================================== gawk -f bbbb.awk list.txt > out.txt ============================================ bbbb.awk =================================== {printf "copy aaa\\%s bbb\\%s\n",$0,$0} ============================================

kariyu1231
質問者

お礼

これが初めはやりたかったのですが・・・やっぱり知識不足でした。 でも移行が出来るというのが分かったので良かったです。 本当に有難うございました。