CSV의 필드를 결합하는 정규식

CSV의 필드를 결합하는 정규식

다음 형식의 2백만 개가 넘는 레코드가 포함된 CSV가 있습니다.

path;name;extension;size;date;user    
/foo/;difacs;cgi;3,795;18-07-2011;Unix User\pads
/foo/;difacs.cgi;bak;2,622;03-12-2009;Unix User\pads
/foo/test/kzt/netcdfSample/testing/;zzz;;401;27-07-2006;Unix User\kzt
/foo/test/kzt/netcdfSample/vic_netcdf_popup/;a;txt;1,832;17-02-2006;Unix User\kzt

경로, 이름 및 확장자를 올바른 형식의 하나의 필드에 결합해야 합니다.

path;size;date;user    
/foo/difacs.cgi;3,795;18-07-2011;Unix User\pads
/foo/difacs.cgi;bak;2,622;03-12-2009;Unix User\pads
/foo/test/kzt/netcdfSample/testing/zzz/;401;27-07-2006;Unix User\kzt
/foo/test/kzt/netcdfSample/vic_netcdf_popup/a.txt;1,832;17-02-2006;Unix User\kzt

미리 감사드립니다!

답변1

이것은 빈 확장 필드를 올바르게 처리하고 의도적으로 두 번째 또는 세 번째 필드에 존재할 수 있는 점을 잘못 바꾸는 것을 방지하는 slhck의 답변에 대한 변형입니다.

sed 's/^\([^;]*\);\([^;]*\)/\1\2/;ta;:a;s/^[^;]\+;;/&/;t;s/;/./' inputfile

세 번째 캡처 그룹을 사용할 필요는 없습니다. 그 대답은 그것 없이도 작동합니다. 대체 명령의 오른쪽에 있는 점을 이스케이프 처리할 필요는 없습니다.

내 스크립트에 대한 설명은 다음과 같습니다.

  • 필드를 구분하는 세미콜론을 제외하고 처음 두 필드를 캡처합니다.
  • ta;:a- 교체가 성공적으로 이루어진 경우 :a바로 뒤따르는 레이블로 분기합니다. 이렇게 하면 "성공" 플래그가 효과적으로 지워집니다.
  • s/^[^;]\+;;/&/- 세미콜론 두 개가 뒤따르는 비세미콜론 시퀀스(연결된 첫 번째와 두 번째 필드, 그 뒤에 빈 세 번째 필드)를 자체적으로 교체합니다. 이는 작동하지 않지만 "성공" 플래그를 설정합니다.
  • t- 마지막 교체가 성공한 경우(세 번째 필드가 비어 있음) 현재 줄의 처리 끝으로 건너뜁니다(레이블이 지정되지 않았기 때문에).
  • s/;/./- 이 지점에 도달했다면(세 번째 필드는~ 아니다비어 있음), 세미콜론을 점으로 바꿉니다.

관련 정보