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개의 쉼표가 포함된 줄을 찾습니다. 여기서 네 번째 쉼표 뒤에는 선택적 \h가로 공백이 오고 ###각 레코드의 시작을 식별합니다.

관련 정보