unixコマンドを使用してファイルの最後のフィールドに二重引用符を追加する

unixコマンドを使用してファイルの最後のフィールドに二重引用符を追加する

次のファイル形式(カンマ区切りのファイルfield1、field2、field3、field4、field5)でSplunkにアプリケーションログを抽出する必要があります。 Field5には、改行、挿入されたカンマ、二重引用符などの特殊文字があります。このフィールドを二重引用符で囲み、値の特殊文字をエスケープする必要があります。 sedとawkを使用して値の特殊文字をエスケープし、最後のフィールドまでフィールドを二重引用符で囲みました。

不運。誰でも手がかりを提供できれば、大きな助けになります。

実際のログファイルのサンプルデータ

abc,def,ghi,jkl,###abcjkl, defghi"ifgnhgt", NOSQL
executed sql 
abc|def|ghi|68
abc|jkl|opg|78
INFO: (Sql statement: select col1, col2, col3 from table_schema.table_name)
abc,def,ghi,jkl,####oprght, hghihk"lklmnp", PostgreSQL
executed sql
select col1,
col2,
col3 
from table_schema.table_name
abc,def,ghi,jkl,####[email protected], [email protected], [email protected],
[email protected]
abc, def, ghi,jkl, ###      PID:238876   ###

次の形式を入力してください。

abc,def,ghi,jkl,"###abcjkl, defghi\\"ifgnhgt\\", NOSQL
executed sql 
abc|def|ghi|68
abc|jkl|opg|78
INFO: (Sql statement: select col1, col2, col3 from table_schema.table_name)"
abc,def,ghi,jkl,"####oprght, hghihk\\"lklmnp\\", PostgreSQL
executed sql
select col1,
col2,
col3 
from table_schema.table_name"
abc,def,ghi,jkl,"####[email protected], [email protected], [email protected],
[email protected]"
abc, def, ghi,jkl, "###      PID:238876   ###"

ありがとう

ベストアンサー1

次のように見えます。

perl -ne '
  sub process {
    if (defined($before)) {
      chomp $after;
      printf qq(%s"%s"\n), $before, $after =~ s/"/\\\\"/gr
    }
  }
  if (/^([^,]*,){4}\h*\K###.*/s) {
    process;
    $before = $`; $after = $&
  } else {
    $after .= $_
  }
  END{process}' < your-file

少なくとも4つのカンマを含む行を探します。ここで、4番目のカンマの後には、オプションの水平スペースが続き、\h###レコードの先頭を識別します。

おすすめ記事