CSVでフィールドを分割し、その行のフィールドを新しい行にコピーする方法

CSVでフィールドを分割し、その行のフィールドを新しい行にコピーする方法

CSVファイルを使用するターゲットがあり、6番目のフィールドに単語が含まれていますが、最大文字長は16文字です。フィールドが16文字を超える場合は、行をコピーして単語を途切れることなく分離したいと思います。

現在のファイル

"5","4","3","2","1","XYZ ABCD E"
"1","2","3","4","5","AB CDE F GHI JK LMNOP Q RS TUV W XYZ 12 3456 7890"
"9","8","7","6","5","LMN O PQ R"

希望の出力

"5","4","3","2","1","XYZ ABCD E"
"1","2","3","4","5","AB CDE F GHI JK"
"1","2","3","4","5","LMNOP Q RS TUV W"
"1","2","3","4","5","XYZ 12 3456 7890"
"9","8","7","6","5","LMN O PQ R"

ベストアンサー1

GNU Awk( gawk) を使って実行fold行/変数/コプロセスのインポート

gawk -F, '
  BEGIN{
    OFS=FS; 
    cmd="fold -sw 16";
  }

  # if total length (16 + 2 for quotes) is within limit, print as-is
  length($NF) <= 18 {print; next}

  # else
  {
    # trim the quotes, then fold
    print substr($NF,2,length($NF)-2) |& cmd; 
    close(cmd,"to"); 
    NF--; 
    while((cmd |& getline var) > 0){

      # (optional) trim trailing whitespace
      sub(/[ \t]+$/,"",var);

      print $0, "\"" var "\"" ;
    }
    close(cmd,"from");
  }
' file.csv

ジョブからsub末尾のスペースを削除しますfold

fold -sw17表示された正確な出力を得るには、16文字を末尾のスペースで囲む必要があります(その後削除されます)。ただし、これを行うと、折りたたまれた出力の最後の行が16文字の制限を超える可能性があります。

おすすめ記事