2017-11-02 9 views
4

私はFPATでうれしくgawkを使用しています。ここで私は私の例で使用するスクリプトです:空のフィールド、エスケープされた引用符、カンマでawkでCSVを解析します。

#!/usr/bin/gawk -f 

BEGIN { 
    FPAT="([^,]*)|(\"[^\"]+\")" 
} 

{ 
    for (i=1; i<=NF; i++) { 
     printf "Record #%s, field #%s: %s\n", NR, i, $i 
    } 
} 

はシンプル、引用符なし

作品も。引用符

$ echo 'a,b,c,d' | ./test.awk 
Record #1, field #1: a 
Record #1, field #2: b 
Record #1, field #3: c 
Record #1, field #4: d 

はうまく動作します。空の列で

$ echo '"a","b",c,d' | ./test.awk 
Record #1, field #1: "a" 
Record #1, field #2: "b" 
Record #1, field #3: c 
Record #1, field #4: d 

とうまく動作し

を引用しています。

$ echo '"a","b",,d' | ./test.awk 
Record #1, field #1: "a" 
Record #1, field #2: "b" 
Record #1, field #3: 
Record #1, field #4: d 

では、引用符、空の列をエスケープしても

作品を引用しています。列エスケープ引用符を含むコンマで終わると

$ echo '"""a"": aaa","b",,d' | ./test.awk 
Record #1, field #1: """a"": aaa" 
Record #1, field #2: "b" 
Record #1, field #3: 
Record #1, field #4: d 

が失敗。

$ echo '"""a"": aaa,","b",,d' | ./test.awk 
Record #1, field #1: """a"": aaa 
Record #1, field #2: "," 
Record #1, field #3: b" 
Record #1, field #4: 
Record #1, field #5: d 

予想される出力:

$ echo '"""a"": aaa,","b",,d' | ./test_that_would_be_working.awk 
Record #1, field #1: """a"": aaa," 
Record #1, field #2: "b" 
Record #1, field #4: 
Record #1, field #5: d 

は、この作業になるだろうFPATのための正規表現があり、またはこれだけのawkでサポートされていませんか?

パターンは"で、それに続く単一の文字は"です。正規表現のクラス検索は、一度に1文字ずつしか動作しないので、と一致しません。""と一致します。

私はそこにオプションがあるかもしれないと思うが、私はそれを動作させるのに十分ではない。

+1

@RomanPerekhrest、それは四つのフィールドです。フィールドセパレータとして '|| 'を使用すると、' '||" b "b、| c' – jas

+0

@BenoitDuffez、別の解決策がありますか?単純な1ライナー – RomanPerekhrest

+0

@BenoitDuffez、残念ながら、質問は重複としてマークされており、私は答えを追加することはできません。それでも入手したいのであれば、 'awk'に言及することなく、' python'タグで質問を投稿してください。そして、私に知らせてください – RomanPerekhrest

答えて

1

awkのFPATはルックアラウンドを知らないので、パターンを明示する必要があります。この1は行います:

FPAT="[^,\"]*|\"([^\"]|\"\")*\"" 

説明:

[^,\"]*    # match 0 or more times any character except , and " 
|     # OR 
\"     # match '"' 
    ([^\"]   # followed by 0 or more anything but '"' 
    |    # OR 
    \"\"    # '""' 
)*   
\"     # ending with '"' 

今それをテスト:

$ cat tst.awk 
BEGIN { 
    FPAT="[^,\"]*|\"([^\"]|\"\")*\"" 
} 
{ 
    for (i=1; i<=NF; i++){ printf "Record #%s, field #%s: %s\n", NR, i, $i } 
} 


$ echo '"""a"": aaa,","b",,d' | awk -f tst.awk 
Record #1, field #1: """a"": aaa," 
Record #1, field #2: "b" 
Record #1, field #3: 
Record #1, field #4: d 
+0

素敵です。ありがとうございました! –

関連する問題