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

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

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

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

AWK

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

Q&A

解決済

3回答

2089閲覧

Windows非エンジニアにawk動かしてもらいたい!

hacosato

総合スコア48

Windows

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

AWK

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

0グッド

0クリップ

投稿2018/11/27 03:08

テキストファイルを受け取り、ふたつに分割するawkを書きました。

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

beforeMMDD.txtは1行1レコードのファイルです。だいたい100万行あります。
これを、正規表現に合致するかどうかで行をばらばらにしてふたつのファイルに分けます。
beforeもafterも最初の1行は半角スペースです。
上記は試行錯誤の結果、無事に動くようになりました!

わたしはこれをMacのターミナルで動かしています。
同じことをWindows使っている非エンジニアのひとにやってもらいたいと思っています。
毎日異なるbeforeMMDD.txtがあるので、1日1回はこの作業が必要です。
MMDDのところには日付が入ります。

手探りでGoogle Apps Scriptを書いてみましたが、
データが重すぎて実用的ではありませんでした。
ローカルで作業する方法がいいかと思っています。
上記のコードを何らかの方法で渡す(シェルスクリプト?)ことができたらいいし、
同じことが何かのエディタなどでできるならそれもいいです。
ただ、わたしはWindowsはほとんど触ったことがありません…。

■非エンジニアさん環境
・Excelの簡単な関数までなら使える
・Windowsのバージョンは10か8
・できればGUIでファイルを指定したりしたいけど、ファイルパスを書き込んでもらうのでもいいです
・新しいアプリの導入はOK!

■わたしの環境
・macOS 10.13.6
・bash 3.2.57
・awkのバージョンの調べ方がわからなかった…( awk -V したら awk: unknown option -V ignored と出ました)

よろしくお願いします!

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

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

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

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

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

guest

回答3

0

正規表現が簡単な物なら、下記の内容の、aaaaa.batというファイルを作り、コマンドプロンプトらそのファイル名を指定するなり、ファイルをダブルクリックするなりして実行できます。
findstrはWindows標準機能です。

CMD

1cd 対象ディレクトリ 2echo. >afterMMDD_1.txt 3findstr /r "正規表現" beforeMMDD.txt >> afterMMDD_1.txt 4findstr /v /r "正規表現" beforeMMDD.txt > afterMMDD_2.txt

findstrが対応していないような正規表現だと、awkあるいはgrepPythonRubyなどをインストールするか、Windows標準の独自言語、PowershellとかVBScriptなどを使って書きます。
外部からのソフトインストールが難しい人だと、後者が良いでしょうね。

投稿2018/11/27 05:32

otn

総合スコア84499

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

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

hacosato

2018/11/27 06:32 編集

ありがとうございます。 試してみないとなんとも言えませんが、正規表現はめっちゃ簡単(行が特定のキャラクタで終われば、みたいな感じ)なので、たぶん対応していると勝手に思っています。 .batファイルを作るのならできそうなので、まずはそれを試してみます。 Pythonも書こうと思えば書けそうなんですが、WindowsにPythonのインストールは難しいと聞いていまして…(他人のマシンなのでなおさら…)。 beforeMMDD.txtのファイル名は毎日変わるんですが、それはbatファイルを事前にテキストエディタで開いて書き換えておいてから実行してもらう流れになりますよね。
CHERRY

2018/11/27 06:51

(横からですが...) コマンドプロンプトでも OK なら a.bat beforeMMDD.txt とコマンドプロンプトで実行した場合、a.bat ファイルの中で、 %1 で 1番目の引数(ファイル名)が取得できます。 https://qiita.com/hkuno/items/e7fedc20a61979aa6078 等が参考になると思います。
hacosato

2018/11/27 07:25

ありがとうございます! ということは、 .batファイルの3〜4行目を findstr /r "正規表現" %1 >> %2 findstr /v /r "正規表現" %1 >> %3 のようにしておいて、コマンドプロンプトで呼び出すときに a.bat beforeMMDD.txt afterMMDD_1.txt afterMMDD_2.txt という感じで指定すればうまくいきそう! (いまは手元にWindows機がないため、妄想を書いていますが合っていますか…)
hacosato

2018/11/27 07:56

追加でご質問です。 findstr /r "正規表現" beforeMMDD.txt >> afterMMDD_1.txt 3行目のこの部分、「>>」は「>」の間違いでしょうか? また、BEGIN {print " "}に相当する部分を追加するにはWindowsの標準機能でどのようにやったらよろしいでしょうか?
otn

2018/11/27 09:28

> BEGIN {print " "}に相当する部分を追加するには echoの行がそれです。 「>>」は追加書きで、echoで空白を書き込んだ続きにfindstrで書きます。 %1 %2 %3の理解は合っています。 > 行が特定のキャラクタで終われば、みたいな感じ 「行がAで終われば」であれば、findstr /r "A$" です。
hacosato

2018/11/27 09:41

ありがとうございます。 Windows機を借りられるときに試してみます!
pepperleaf

2018/12/05 12:04

PowerShell使う場合ですが、別のPCから、PowerShellのコマンドファイルをコピーした場合、実行に制限が掛かります。(セキュリティ問題) ご注意を。 解除は容易ですが、知らないと一時、悩む事になります。 具体的方法は、、、しばらく使ってないので忘れましたが、、。
guest

0

まずcygwinをインストールしましょう。unix系のOSでお馴染みのツール群が「Macのターミナル」と同じように(細部の仕様は異なるかもしれない)使えるようになります。

なお質問中のawkスクリプトですが、次のようにすればおそらく所要時間がほぼ半分ですみます。

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

投稿2018/11/27 05:24

KojiDoi

総合スコア13671

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

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

hacosato

2018/11/27 06:49

ありがとうございます。 cygwin、そういうキーワードがあると検索が進みます! ありがたいです。 また、awkワンライナーにしてくださりありがとうございます! かっこいい! 処理は体感で1秒ぐらいだったのが5秒ぐらいになってしまいましたが、1行にまとまっている方がトータルでは早いので、こちらを使いたいと思います。 しかし、afterの_1.txtの方の1行目に半角スペースが入らなくなってしまいました…。 これは必要なんですが、なにか原因わかりますでしょうか? いまは質問時と同じMacの環境で試しています。 ■わたしの環境 ・macOS 10.13.6 ・bash 3.2.57
KojiDoi

2018/11/27 07:26

すみません、見落としがありましたね。次のでいけると思います。 awk 'BEGIN {print " " > "afterMMDD_1.txt"} /正規表現〜\r/{print > "afterMMDD_1.txt"} !/正規表現〜\r/{print > "afterMMDD_2.txt"} ' /beforeMMDD.txt
hacosato

2018/11/27 08:18 編集

ありがとうございました。きちんと動きました。 BEGINの内容を一度ファイルにして、そのあともう一度正規表現の内容をテキストファイルに適用する感じですね! 自分なりにやろうとしたんですが自分ではできませんでした…。スキル不足。 Windows機借りられるときにcygwin入れてみます。
pepperleaf

2018/12/05 12:01

横から、申し訳ありませんが、、、 cygwin、初心者には勧められません。 ご自身で使われる分には止めませんが、今回のような初心者に使わせる環境では、止めた方が賢明と思います。Windows上で、Unixコマンドが使える環境を作る訳で、一般的では無く、サポートコストが増えるだけと思います。Batファイルまたは、Window用のawk導入までが適切では無いかと。
hacosato

2018/12/07 00:56

インストールのチュートリアルを見て挫折気味です…。 Windowsのawkインストールは難しくなかったので、いまその方向で検討中です!
guest

0

ベストアンサー

AWK入れて日付処理含めバッチ書いてタスクスケジューラに登録してしまえば実行することすら自動化できますよ。

【統計屋のためのAWK入門 - あんちべ!】
http://antibayesian.hateblo.jp/entry/2014/09/15/162605

【コマンドプロンプトで動くWindows10のバッチファイルの作成と実行 | サービス | プロエンジニア】
http://proengineer.internous.co.jp/content/columnfeature/5104

【Windowsのバッチファイル中で日付をファイル名に使用する (1/2):Tech TIPS - @IT】
http://www.atmarkit.co.jp/ait/articles/0405/01/news002.html

【タスクスケジューラに登録したバッチファイルが動かない – ブログだいちゃん】
http://www.love-hokuto.com/?p=1248

投稿2018/11/27 03:21

kei344

総合スコア69398

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

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

hacosato

2018/11/27 04:20

ありがとうございます。 毎日同じ時間に動かすわけではないのでタイマーで動かすようにはできないのですが、 そういう方法があるの初めて知りました! Macだとcron使うような感じでしょうか?(やったことないですが…) Macのターミナル.appにあたるものとしてWindowsにはコマンドプロンプトというものがあるのですね。 awk 'BEGIN {print " "} /正規表現〜\r/' /beforeMMDD.txt > /afterMMDD_1.txt などの処理は、そのままコマンドプロンプトでも動かせるのでしょうか? いまちょっと手元にWindows機がなくて……。
Takumiboo

2018/11/27 05:01

awkはWindowsにはデフォルトで用意されていません。 http://itref.fc2web.com/unix/awk.html コマンドプロンプトで実行するのであれば上記のようにWindows向けのawkを用意する必要があります。 もしくは、Windows10であればWindows Subsystem for LinuxでUbuntuなどの環境を用意し、そちらのシェル上で実行するという手段もありかもしれません。 https://qiita.com/Aruneko/items/c79810b0b015bebf30bb
kei344

2018/11/27 05:12

To: hacosatoさん > そのままコマンドプロンプトでも動かせるのでしょうか? 提示した一つ目の記事にAWKの導入から書かれていますよ。 To: Takumibooさん 補足ありがとうございます。
hacosato

2018/11/27 05:25

Takumibooさん、kei344さん コメントありがとうございます。 > 提示した一つ目の記事にAWKの導入から書かれていますよ。 すみません、見落としていました…。 パスを通すのが非エンジニアさんにもわたしにもむずかしいかもしれない…。
hacosato

2018/12/04 15:16

gawk、インストールできませんでした…。 指定の場所にexeを置いてダブルクリックしたんですが、一瞬コマンドプロンプトみたいな画面が開いてすぐに閉じてしまいます。 環境はWindows10 64bitとのことでした。 インストールすべきファイルが違うのでしょうか…?
kei344

2018/12/04 15:25

To: hacosatoさん > 指定の場所にexeを置いてダブルクリックしたんですが、一瞬コマンドプロンプトみたいな画面が開いてすぐに閉じてしまいます。 コマンドプロンプトから動かすものです。ダブルクリックしてもGUIは出てきません。
hacosato

2018/12/05 00:26

初歩的なお話でしたね…すみません、また試してみます。
kei344

2018/12/05 05:04

To: hacosatoさん 確認用Windows は(90日間ごとに再セットアップが必要ですが)下記のような方法があります。 【【無料で使える】Windows 10 / 8.1 / 7の仮想マシンイメージファイルを入手する - Engineer's Notebook】 https://eng-notebook.com/post-2199/
hacosato

2018/12/05 05:13 編集

コマンドプロンプトからawkを呼ぶところまでできました! しかしそこから先がうまくいきません。 gawk.exeはawk.exeにリネームしてC:\Windows\System32に入れました。 同じ階層にテキストファイルも入れました。 awk "BEGIN {print ' ' > 'afterMMDD_1.txt'} /正規表現〜\r/{print > 'afterMMDD_1.txt'} !/正規表現〜\r/{print > 'afterMMDD_2.txt'} " beforeMMDD.txt とやってみました。しかし、 /正規表現〜\r/{print > 'afterMMDD_1.txt'} !/正規表現〜\r/{print > 'afterMMDD_2.txt'} " 1206.txt awk: cmd. line:1: BEGIN {print ' ' > eafterMMDD_1.txtf} /正規表現〜\r/{print > eafterMMDD_1.txtf} !/正規表現〜\r/{print > eafterMMDD_2.txtf} awk: cmd. line:1: ^ invalid char ''' in expression awk: cmd. line:1: BEGIN {print ' ' > eafterMMDD_1.txtf} /正規表現〜\r/{print > eafterMMDD_1.txtf} !/正規表現〜\r/{print > eafterMMDD_2.txtf} awk: cmd. line:1: ^ syntax error というエラーが起きて前に進めませんでした…。 もっとシンプルに awk /正規表現/ beforeMMDD.txt とやってみた(正規表現に合致する行だけを表示してほしかった)ところ、 awk: fatal: cannot open file `beforeMMDD.txt' for reading (No such file or directory) というエラーになりました…。System32の直下にbeforeMMDD.txtがあるのですが、場所がよくないのでしょうか? たびたびすみません…。
hacosato

2018/12/06 08:27

コマンドプロンプトのありかはわかりませんでした…。 cdするとなんかCの中のディレクトリが指定されたようなので、そこにbeforeのファイルを置きました。 awk /正規表現〜/ beforeMMDD.txt これを実行したら、表示まではすることができました! ファイルの居所をawkに伝えられました!! awk "BEGIN {print \" \" > afterMMDD_1.txt} /[ACEGIKMOQSUWY02468].....$/{print > afterMMDD_1.txt} !/[ACEGIKMOQSUWY02468].....$/{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: こういうエラーが起こります…。 前回に比べて、シングルクオートをやめて、ダブルクオートのエスケープに変えました(エラーがひとつ減ったと思います)。 まだゴールまでたどり着けず、教えていただけたら幸いです…。
kei344

2018/12/06 09:10

すみませんが、AWKは専門外なのでWindows版で使い方が違うことも知りませんでした。たぶんエスケープの問題だと思うのですが、ちょっとわかりません。 下記の様なページは見つけましたが、正確かどうかはちょっとわかりません。 "" """" """ """ \"" \"" 【Ahah moments in technology: Single quotes with AWK in Windows command shell】 http://ahahintechnology.blogspot.com/2009/12/single-quotes-with-awk-in-windows.html?showComment=1445875989364#c4355528885338887887 【Grep and Awk in Windows Invalid Char in Expression Error - Stack Overflow】 https://stackoverflow.com/questions/4852270/grep-and-awk-in-windows-invalid-char-in-expression-error/8293464#8293464
hacosato

2018/12/07 00:53

ありがとうございます。 もともとの趣旨を離れてきたと思うので、あたらしく質問します。 みなさまご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問