質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

2回答

1025閲覧

Macで動くawkをWindowsでも動かしたい!

hacosato

総合スコア48

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2018/12/07 08:14

Macでawkを書きました。
これをWindowsで動かそうと思っているのですが、動きません…。

環境構築はこれを参考にできました!
http://antibayesian.hateblo.jp/entry/2014/09/15/162605
gawk-4.1.0
Windows 10 64bitです。

awkはこういった↓感じです。わたしのMacで動くことを確認しました。
今回はこれ↓をWindowsユーザに渡して、Winで動かしたいです。

awk 'BEGIN {print " " > "afterMMDD_1.txt"} /正規表現〜\r/{print > "afterMMDD_1.txt"} !/正規表現〜\r/{print > "afterMMDD_2.txt"} ' /beforeMMDD.txt

↑これが動かず、調べるとダブルクオートとエスケープのあたりがおかしいとわかりました。

awk "BEGIN {print \"" \"" > "afterMMDD_1.txt"} /正規表現〜\r/{print > "afterMMDD_1.txt"} !/正規表現〜\r/{print > "afterMMDD_2.txt"} " /beforeMMDD.txt

↑外側をダブルクオートにして、内側の引用符を \"" でエスケープしました。

awk: cmd. line:1: BEGIN {print " awk: cmd. line:1: ^ unterminated string awk: cmd. line:1: BEGIN {print " awk: cmd. line:1: ^ syntax error

だめでした。

エスケープの方法を調べました。
http://ahahintechnology.blogspot.com/2009/12/single-quotes-with-awk-in-windows.html?showComment=1445875989364#c4355528885338887887
↑これを見て、

awk "BEGIN {print "" \"""" > "afterMMDD_1.txt"} /正規表現〜\r/{print > "afterMMDD_1.txt"} !/正規表現〜\r/{print > "afterMMDD_2.txt"} " /beforeMMDD.txt

エスケープを↑このように変えました。

awk: cmd. line:1: BEGIN {print > afterMMDD_1.txt} /正規表現〜/{print > afterMMDD_1.txt} !/正規表現〜/{print > afterMMDD_2.txt} awk: cmd. line:1: ^ syntax error awk: cmd. line:1: BEGIN {print > afterMMDD_1.txt} /正規表現〜/{print > afterMMDD_1.txt} !/正規表現〜/{print > afterMMDD_2.txt} awk: cmd. line:1: ^ syntax error awk: cmd. line:1: BEGIN {print > afterMMDD_1.txt} /正規表現〜/{print > afterMMDD_1.txt} !/正規表現〜/{print > afterMMDD_2.txt} awk: cmd. line:1:

やっぱりだめでした。

Windowsのgawkで動くように書き換える方法を教えてほしいです!

↓この質問の続きです。
https://teratail.com/questions/160548

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

案1:簡単には、KojiDoiさんの回答のように、awk 'スクリプト' /beforeMMDD.txtの、「スクリプト」の部分を取り出してファイルに書いて、awf -f ファイル名 /beforeMMDD.txtで実行します。

案2:スクリプト内部で文字列リテラルを使わないで書きます。つまり、"~~"の中に"を書かない。

CMD

1awk -v SP=" " -v FILE1=afterMMDD_1.txt -v FILE2=afterMMDD_2.txt "BEGIN{print SP >FILE1} /正規表現〜\r/{print >FILE1;next}{print >FILE2}" /beforeMMDD.txt

また、nextで次の行の処理に移りますので、ちょっと書き換えました。

投稿2018/12/07 17:20

otn

総合スコア84559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacosato

2018/12/10 04:55

ありがとうございます。 WInではまだためしてないのですが、Macで同じようにnextのあたりなどを書き換えて、いままでと同じように動くのを確かめました! りくつがまだよくわからないのですが…どうして正規表現はひとつにまとめることができたのでしょうか? ifとelseみたいな処理ができるのですか? あとでWin機を借りられるときに、エスケープ含めて確認します!
otn

2018/12/10 05:02

nextというのは、「今の入力行に対しての処理を終える」ということです。 関数定義で、途中でリターンしちゃうような感じですね。 Cで言うと、 foo(int x){ if(x==1) { printf("OK\n"); } if(x!=1) { printf("NG\n"); } ) を、 foo(int x){ if(x==1) { printf("OK\n"); return;} printf("NG\n"); )
hacosato

2018/12/10 06:34

めっちゃわかりました! ありがとうございます〜! (関係ないですが、わたしCまったくやったことないのにどういう処理をしているのか理解できるの、“わかる…わかるぞ…!”って感じがしてとてもたのしいです♪) Winでの動きについてはまた報告します。
hacosato

2018/12/18 00:04

大変遅くなりました。案2で解決しました! ありがとうございます!
guest

0

何にせよとても読みにくいですから、素直にスクリプト部分をファイルに書き出し

awk -f myscript.awk /beforeMMDD.txt

のようにすることを勧めます。

(cygwinならMacのコマンドラインで実行したのとほぼ同じように行けるはずなんですがねえ。)

投稿2018/12/07 08:51

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacosato

2018/12/10 04:30

ご回答ありがとうございます。 cygwinはインストールが大変そうで、トラブルが起こったときに対処できそうになく、現時点では次善の策として考えています。 スクリプト部分を別ファイルに書き出すの、Win機使えるときにやってみます。 otnさんの回答を見るまでこの良さがわかっていなかったんですが、別ファイルに書き出すと一番外のダブルクオートが不要になるというメリットがあるのですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問