• ベストアンサー

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% (4846/10257)
回答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
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • unixのawkについて

    unixでawkを使ってフルパスからディレクトリとファイル名に分けようと しているのですが、上手くいきません。 例えば ①/aaa/bbb/ccc ②/111/222/333/hoge.txt ③/hoge/foo/bar/dk@0:1 を ①/aaa/bbb と ccc ②/111/222/333 と hoge.txt ③/hoge/foo/bar と dk@0:1 としたいのです。 echo "/111/222/333/hoge.txt" | gawk '{sub(/\/.*$/,"",$0); print}' としてみたのですが、 ディレクトリだけを取り出そうとしたのですが上手くいきません。 よろしくお願いします。 OSは、Solaris、Linuxになります。

  • 今、awkを使ったシェルスクリプトを作っています。

    今、awkを使ったシェルスクリプトを作っています。 aaa bbb ccc ddd ee ff gggg hhh といったファイルから、 bbb,ccc ff,gggg を取り出したいと思っています。 そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、 ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。 A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'` B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'` ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • awkのセパレータ指定について

    awkのセパレータ指定について教えてください。 以下のようなファイルがありそれを'||'区切りで出力したいです。 下記のような指定をしてみたのですが、 うまくいきませんでした。 cat text | awk -F '||' '{print $1}' [test.txt] aaa||bbb||ccc [期待する結果] print $1 → aaa print $2 → bbb print $3 → ccc どなたか教えてください。 よろしくお願いします。

  • DOSコマンド(COPYコマンド)について

    DOS上でのCOPYコマンドについて確認します。 EXCELのファイルで、毎回ファイル名が変わるため、COPYコマンドで固定のファイル名にしようと思い、バッチ起動で、COPY \AAA\*.XLS \AAA\BBB.XLSで実行すると、コピー元と違うファイルサイズのBBB.XLSが作成されます。 中身を参照すると、文字化けしたものが 1レコードだけ作成されています。どうしてなのでしょうか? ※コピー元の*.XLSは、毎回 1ファイルのみです。

  • awkで¥をエスケープする方法

    awkで以下のように文字列置換したいのですが、変数strA内で¥マークを使用すると正常に置換してくれません。どのようにエスケープすれば良いのでしょうか? ================================================= --実行コマンド---------- gawk -f CNV.awk input.txt --input.txt---------------- いぬ¥ねこ --CNV.awk---------------- strA="ぬ¥ね"; strB="★"; gsub(strA, strB, $0); print $0; ================================================= このとき、「い★こ」という結果を期待しているのですが出力がありません。 また、 strA="ぬ¥¥ね"; や strA='ぬ¥ね'; と指定しても同様にダメでした。 どなたか解決策をご存知でしたらご教授宜しくお願い致します。

    • ベストアンサー
    • Ruby
  • gawk複数ファイルを同ファイル名でフォーマットする方法

    gawk複数ファイルを同ファイル名でフォーマットする方法 gawkを使いcsv形式のファイルをjson形式のファイルにフォーマットしようと考えています。 簡単に説明しますと、 ●csvファイル test1.csv test2.csv test3.csv ↓↓↓↓ ●jsonファイル xxx-test1.json xxx-test2.json xxx-test3.json という風にフォーマットさせたいのです。 現在、 jsonファイル出力後の記述を ●aaa.awk BEGIN { FS = ","; printf("{"); } { printf("%s,%s,%s,%s", $1,$3,$4,$5); printf("],"); } END { printf("}"); } このようにし ●コマンドライン gawk -f aaa.awk test1.csv > xxx-test1.json これで一ファイルずつのフォーマットはできたのですが、 ファイル数が複数あり面倒なため、一気にフォーマットしたいのです。 その方法をご教授お願い致します。

  • awkスクリプトでダブルクォーテーションの削除

    作成しているawkスクリプトを実行すると ”aaa" "1111" "kkk" ”bbb" "2222" "jjj" という出力になってしまいます。 ダルルクォーテーションを削除したかったので printf(”%s %s %s\n"、 adata、 bdata、 cdata)        ↓ adataprint =gsub(”¥””、” ”、adata) bdataprint =gsub(”¥””、” ”、bdata) cdataprint =gsub(”¥””、” ”、cdata) printf(”%s %s %s\n"、 adataprint、 bdataprint、 cdataprint) としてみたのですが思ったような出力 aaa 1111 kkk bbb 2222 jjj にはなってくれません。 こういった処理はどのようにすればいいのか誰か教えていただけないでしょうか?

  • DOSコマンド COPY(複数ファイルをまとめる)

    DOSコマンドで、複数ファイルをまとめるのに COPYコマンドを使用しています。 まとめたファイル上にコメント文を加えたいのですが どうすればできるのでしょうか? 下記は、a.txtとb.txtをまとめて、c.txtにしています。 copy a.txt + b.txt c.txt だと、 そのままデータがつながってしまい、コメント文を 入れることができません。 [a.txt] aaa [b.txt] bbb  ↓ [c.txt] "Input A.txt" aaa "Input B.txt" bbb

  • awkで、キーボードからファイルを指定するには

    私は、awkプログラムを始めたばかりの初心者です。 データファイルがfile1、file2、file3とあって、どのファイルを実行させたいかをキーボードから入力させるには、どのようにすればよいのでしょうか。 次のようなプログラムを作ったのですが、うまくいきません。 { printf "ファイル名?" > "/dev/stderr"#画面表示 getline < "/dev/stdin" #数字入力 aaa = $0 #aaaに代入 } { getline < ("file"aaa".txt") #ファイル入力 print $0 #レコードを出力 } これを、バッジファイルで次のように実行をかけて、「結果.txt」に出力する。 jgawk -f prog.awk con > 結果.txt すると、コマンド画面が消えず、エラーとなってしまいます。 バッジファイルに問題があるのでしょうか。 「-f」の後には、プログラム名、データ名>出力ファイル名 とやるようですが、この場合、データ名が決まっていないわけで、キーボード入力したいのだから、「con」でいいのでしょうか。 プログラムを実行させるのに、ほかに良い方法があるのでしょうか。

  • コピー元が固定パスでない場合のxcopyコマンドの書き方

    xcopyコマンドをバッチファイルで実行するのですが、 固定パスの場合は、 xcopy c:\aaa\bbb.txt c:\ccc (c:\aaaフォルダ内のbbb.txtをc:\ccc) と書けばよいと思うのですが、 コピー元が固定のパスではない場合はどうやって書けば良いのでしょうか? やりたいことは、 dddと言うフォルダの中にバッチファイルとeeeフォルダが あり、eeeフォルダの中にコピーしたいもの(fff.txt)が入っています。コピー先は固定でc:\gggの場合 dddと言うフォルダは何処にあっても可能な場合です。 win2000とwin98で書き方が違う場合は両方お願い致します。 よろしくお願いいたします。

このQ&Aのポイント
  • 小諸市の小泉市長が、ロシアの大統領プーチンにウクライナ侵攻に抗議文を送った。
  • 市役所ではウクライナ国旗の掲揚や募金箱の設置も行っている。
  • 小泉市長は行動的な市長として知られている。
回答を見る

専門家に質問してみよう