awk

awkでcsv全ての項目をダブルクォーテーションで囲む

全ての項目をダブルクォーテーションで囲みたい。ただし3,4番目の項目はダブルクォーテーションで囲まれる場合がある。当然この場合さらに囲むような事はしたくない。ダブルクォーテーションで囲まれているデータにはカンマ(、)や、半角空白が入っていたりする。
ポイントは1行目のカンマがダブルクオーテーションで囲まれている点、2行目2番目項目がNULL、3行目最終項目がダブルクオーテーションで囲まれている、4行目最終項目がNULLで終了している点となります。

※以下の動作はGNU Awk 4.0.2~4.2.1にて確認できていますが、Ver. 3.1.7では以下とは異なる動作となる事がわかりました。 ( 2023/01/13)

テストデータとして以下test.csvファイルを用意します
1,nishikawa,"西,川",にしかわ
2,,東,あずま
3,kitagawa,"北,川","きたがわ"
4,minami,南,
実行コマンド
cat test.csv | awk 'BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; OFS = "\t" } {
print (gsub("\"","",$3),gsub("\"","",$4), $1,$2,$3,$4)
}' | awk 'BEGIN { FS="\t";OFS = "\t" }
{print $3,$4,$5,$6}' | awk 'BEGIN {  FS="\t";OFS = "," }
{
  for (i=1; i<=NF; i++) {
    printf "\"%s\"", $i;
    if( i < NF ) printf "%s",OFS
  }
  printf "\n"
}'
実行結果
"1","nishikawa","西,川","にしかわ"
"2","","東","あずま"
"3","kitagawa","北,川","きたがわ"
"4","minami","南",""

awkのバージョン確認
awk -W version
# awk -W version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2018 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
#
スポンサーリンク
コピペで使う