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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

AWK

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

Q&A

解決済

3回答

1269閲覧

【awk】csvファイルをフィールド値で判定し2つのファイルに書き出す

dos_1980_bat

総合スコア6

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

AWK

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

0グッド

0クリップ

投稿2020/02/18 08:40

前提・実現したいこと

awkでcsvファイルをフィールドの値によって2つのファイルに分割したい。

・業務用システムが出力したcsvを分割(抽出)する
・windowsのコマンドプロンプトにてgawkスクリプトを利用
・フィールド2が空白ならAファイル、それ以外はBファイルに書き出す

発生している問題・エラーメッセージ

・if文で処理を分けたいがうまく書けず、
現状はAファイル、Bファイルをそれぞれ抽出しています

該当のソースコード

*** test.cmd gawk -f "kuuhaku.awk" indata.csv > kuuhaku.csv gawk -f "igai.awk" indata.csv > igai.csv ***kuuhaku.awk BEGIN{ FS = ","; OFS = ","; } { if ( $2 == null ){ print($0) ; } END{ } ***`igai.awk BEGIN{ FS = ","; OFS = ","; } { if ( $2 != null ){ print($0) ;    } } END{ } ### 試したこと if else で書けないか試しましたがうまくいきませんでした。 ### 補足情報 1980年代にMS-DOSツール(アスキー)に入っていたgrepやawkでcsvファイルをいじった記憶があります。 今回、仕事の必要に迫られ、昔似たようなことやったなあと思って探したところwindowsで走るgawkを見つけ、Webを参考に走らせています。 初歩的な質問で誠に恐縮です。よろしくお願いいたします。 ・

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

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

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

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

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

guest

回答3

0

ベストアンサー

回答としてはY.H.さんの通りですが、質問のコードでの注意です。
if($2 == null)ですが、awkにはnullというキーワードは無いので、単なる未定義変数です。
未定義変数は、数値として評価されたとき0で、文字列として評価されたときは空文字列です。

==の比較の際に$2が数字からなる文字列の場合は、数値として比較されますので、意図しない結果になります。

sh

1echo 1 0 | awk '{if($2 == null) print "Col 2 is Null"}' #ゼロとゼロの比較で真になる

空文字列かの比較対象には、""を使いましょう。

若干の修正例:

awk

1BEGIN{FS=OFS=",";} $2==""{print >out1;next}{print >out2}

if/elseで書くなら:

awk

1BEGIN{FS=OFS=",";} {if($2==""){print >out1}else{print >out2}}

投稿2020/02/18 09:46

otn

総合スコア84499

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

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

dos_1980_bat

2020/02/20 03:19

otn様 (1)空文字列判定について、アドバイスありがとうございました。   以降、””を使うようにします。 (2)ソースの修正とif-elseの件、回答ありがとうございました。  いずれもうまく動きました。 ** test1.awk BEGIN{FS = OFS = ",";out1="file1.txt";out2="file2.txt"} $2 == "" {print > out1;next}{print > out2} END{} ** test2.awk BEGIN{FS = OFS = ",";out1="file1.txt";out2="file2.txt"} {if($2==""){print >out1}else{print >out2}} END{} ※みなさまのご回答にてうまく動きました。ご回答に感謝いたします。  空文字列判定についてコメントいただいたotn様をベストアンサーとさせていだだきました。
guest

0

普段はLinuxですがgawkなのでこれで動くかと

sample

1BEGIN{FS=",";fa="fileA";fb="fileB"}{ot=fb;if($2=="")ot=fa;print $0 >ot}

gawk -f sample.awk indata.csv

windowsでも動きました
gawk -F, -v fa=fileA -v fb=fileB "{ot=fa; if(length($2)>0)ot=fb; print $0>ot}" indata.csv

投稿2020/02/18 09:37

編集2020/02/18 10:35
amura

総合スコア333

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

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

dos_1980_bat

2020/02/20 02:38

amura様、ありがとうございました。 回答いただいた「gawk -f sample.awk indata.csv」そのままでうまく動きました。 ご指導ありがとうございました。
guest

0

$2 == "" {print > out1}$2 != "" {print > out2}のようにパターン指定で$2を判定し
リダイレクトでファイルに出力してしまうのが手っ取り早いです。

awk

1$ cat input.csv 21,,AAA 31,3,BBB 42,,AAA 52,3,BBB 6$ gawk -v out1=file1.txt -v out2=file2.txt 'BEGIN{FS = ",";OFS = ",";}$2 == "" {print > out1}$2 != "" {print > out2}' input.csv 7$ cat file1.txt 81,,AAA 92,,AAA 10$ cat file2.txt 111,3,BBB 122,3,BBB

投稿2020/02/18 09:17

Y.H.

総合スコア7914

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

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

dos_1980_bat

2020/02/20 02:18

Y.H.様、ありがとうございました。回答を参考に以下の記述を試したらうまくいきました。 ご指導ありがとうございました。 ** test1.awk BEGIN{FS = ",";OFS = ",";out1="file1.txt";out2="file2.txt"} $2 == "" {print > out1} $2 != "" {print > out2} END{} ** test1.cmd gawk -f "test1.awk" input.csv **コマンドプロンプトから、test.cmdを実行
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問