0

次のような CSV ファイルがあります。

  height,  comment, name
  152,  he was late, for example, on Tuesday, Fred
  162, , Sam

このファイルは、コメント フィールドにさまざまな数の囲まれていないコンマが含まれている (ただし、他のフィールドは含まれていない) ため、解析できません。awk2番目のフィールドのコンマがセミコロンになるように(これは私にとって非常に新しい)を使用してファイルを修正したいと思います。

  height,  comment, name
  152,  he was late; for example; on Tuesday, Fred
  162, , Sam

(CSV パーサーが引用符を認識しないため、フィールド全体を引用符で囲んでも問題は解決しません。)

これまでのところ、NF を使用して囲まれていないコンマの数を計算し、gsub を使用してそれらを不快な正規表現に置き換えることを検討していますが、awk を活用してより読みやすいプログラムを作成できるはずだと感じており、NF が動作するかどうかはわかりませんこちらです。

4

2 に答える 2

2

基本的には強引なソリューションですが、かなり理解しやすいものです。で呼び出す

$ awk -F "," -f test.awk test.dat

awkファイル。

$ cat test.awk
{
    printf "%s, ", $1

    if (NF > 3) {
        for (i = 2; i < NF; i++) {
            printf "%s;", $i
        }
        printf ", "
    }
    else {
        printf "%s, ", $2
    }

    printf "%s\n", $NF
}
于 2013-02-13T03:41:26.593 に答える
2
$ cat file
  height,  comment, name
  152,  he was late, for example, on Tuesday, Fred
  162, , Sam

$ awk -v OFS=, '{
   height = comment = name = $0
   sub(/,.*$/,"",height)
   sub(/^.*,/,"",name)
   gsub(/^[^,]+,|,[^,]+$/,"",comment)
   gsub(/,/,";",comment)

   print height, comment, name
}' file
  height,  comment, name
  152,  he was late; for example; on Tuesday, Fred
  162, , Sam
于 2013-02-13T03:42:00.550 に答える