0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gawkで先頭が空のCSVデータを加工すると面白いことになる

Posted at

以下のような行の先頭が空のCSVを用意する

input.csv
,b,c,d,e,f
g,h,i,j,k,l

gawk(バージョン:GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)) で加工出力してみる。

gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{print $1,$2,$3,$4,$5,$6}' input.csv

結果は以下、なぜか先頭が空の行であった1行目が全て空で出力されている。(期待値はinput.csvの内容をそのまま出力してほしい)

,,,,,
g,h,i,j,k,l

納得できないため、1項目ずつちゃんと加工できているか調べてみる。

gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{for (i=1; i<=NF; i++) printf "field #%d: %s\n", i, $(i)}' input.csv

結果は以下、field #1は空、それ以外もCSV通りである。
したがって、FPATなどオプションが間違っているわけでもない。

field #1: 
field #2: b
field #3: c
field #4: d
field #5: e
field #6: f
field #1: g
field #2: h
field #3: i
field #4: j
field #5: k
field #6: l

なんで?ということで、stackoverflowに質問。

バグでした

回答を頂いたEd Mortonさんによると、過去あったバグ(https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html )と関連があるもので、以下のように

{oFPAT=FPAT; FPAT=""; FPAT=oFPAT} 

を追加することで対処することができる

gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{oFPAT=FPAT; FPAT=""; FPAT=oFPAT} {print $1,$2,$3,$4,$5,$6}' input.csv

上記バグはEdさんが開発者に報告済み
https://lists.gnu.org/archive/html/bug-gawk/2019-10/msg00041.html

感謝します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?