2017-03-28 6 views
1

私は持っているCSVのディレクトリで何らかのデータ操作をしようとしています。CSVのawkを使って最初の列の日付パターンを探す

最初の列が日付パターンと一致するCSVファイルのすべての行を 'SUMMARY.csv'というファイルに追加したいとします。たとえば、最初の列に3月の日付を持つすべての行が必要です。列には、MM/DD/YYYY形式の日付が含まれます。

データ例:

03/01/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc" 
02/04/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc" 
01/03/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc" 

AWK例:

awk -F, '$1 ~ "03\\/*\\/*" {print}' *.csv >> SUMMARY.csv 

期待される結果:

03/01/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc" 

実際の結果:何らかの理由で

03/01/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc" 
01/03/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc" 

は、私はそれが確実MONTH私はawkのステートメントに入れているものに等しい行のみを引っ張って取得することはできません。

これについてのお手伝いをさせていただきますようお願い申し上げます。これを数日間しています。

答えて

2

フィールドの先頭にアンカーがないため、他の場所の03が一致しています。また、*を間違って使用しているため、実際には/をオプションにしています。

代わりにこれを試してみてください:

awk -F, '$1 ~ /^03/' *.csv 

をあなたのデータの場合、それが十分でなければなりません。 { print }がデフォルトで発生します。 awchがコンパイルしなければならない"の文字列ではなく、/の中にリテラルの正規表現を使用しています。

あなたが最初のフィールドに一致しているので、実際には、あなたが、もっと簡単に行くことができます。

awk -F, '/^03/' *.csv 

をしかし、この時点でそれはより多くのgrepのための仕事のようになります。

grep '^03' *.csv 

これは最初のフィールドでは機能しますが、awkとgrepはCSVパーサではないことに注意してください。引用したフィールド(コンマを含む可能性があります)の中で読み込むなど複雑な作業を始めると、 operパーサ。

+0

感謝を!ですから、私はあなたの提案をとり、 'awk -F、 '$ 1〜/^03 /' * .csv'を使って試しました。値が実際にMM/dd/yyyyなので、これはうまくいきませんでした。 'awk -F、 '$ 1〜/^3 /' * .csv'を使って月 '03'とのマッチだけを返しますが、ディレクトリ内の最初のCSVを経由するようにして、動作させることができます。それは私が* .csvを使用しているので私はすべてを得るだろうと思って変です。何か案は? –

+0

@EliSobylakあなたが今まで私たちに語ったことを与えることは100%不可能であると言っている問題は、それで、まだあなたに話していないことがあります。あなたの問題を示す[mcve]を作成し、新しい質問を投稿する.Tomsの答えは元の質問に答えるからだ。 –

+0

@エドモートンあなたはそうです。いくつか遊んだ後、ファイルを開いて[保存]をクリックするだけでawkコマンドを使用していることがわかりました。私がそれらを再保存した後、awkはそれらをピックアップします。これがなぜ起こったのだろうかと思っています... –

0

starts with (^)の表現を追加しました。そうでなければ、それはどこにでも$1フィールドに03と一致します:

awk -F, '$1 ~ "^03" {print}' *.csv >> SUMMARY.csv 
+0

正規表現の区切り文字は '/'ですが、文字列の区切り文字は '' 'です。文字列から動的正規表現を作成する必要がない限り、効率とシンプルさと堅牢性のため正規表現の区切り文字を使用してください。 –

0

はこれを試してみてください - 迅速な対応のための

awk -F'[/]' '$1 == 03' f 
03/01/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc" 
+0

あなたの正規表現は意味をなさないが、あなたはOPの試行に加えた変更について何の説明もしていない。 –

+0

あなたの入力のおかげで、私は回答。 –

関連する問題