쉘 스크립트를 사용하여 세미콜론으로 구분된 파일의 필드에서 공백 제거

쉘 스크립트를 사용하여 세미콜론으로 구분된 파일의 필드에서 공백 제거

다음과 같은 CSV 파일이 있습니다.

03139; 5;        IT1234978208; 20150930  ;  CTZ 13/31.12.15;
03137; 6;        IT1234978206; 20151015  ;  CTZ 13/31.11.18;
....
....
03134; 8;        IT1234974406; 20151212  ;  CTZ 13/37.13.17;

sedKorn Shell에서 다음과 같은 명령을 사용하여 모든 csv 줄의 모든 공백을 제거하는 해결 방법을 찾고 있습니다 .

03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;

누군가 저를 도와주실 수 있나요?

답변1

세미콜론 앞이나 뒤에 있는 공백만 제거하려는 것 같습니다. 이 경우:

$ sed 's/[[:space:]]*;[[:space:]]*/;/g' text
03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;

작동 방식:

sed 대체 명령은 일반적으로 정규 표현식이 s/old/new/어디에 있는지 와 같습니다 . old이 경우에는 g다음을 나타내는 접미사를 추가합니다.글로벌대체(단순히 하나의 인스턴스를 대체하는 것과 반대). 우리의 경우 olda ;및 주변 공백과 일치합니다 s/[[:space:]]*;[[:space:]]*. 이것은 new단지 a 로 대체됩니다 ;.

답변2

내가 선택하겠습니다 perl. 왜냐하면 그러면 당신은 다음을 수행할 수 있기 때문 split입니다 join:

#!/usr/bin/env perl
use strict;
use warnings;

while ( <DATA> ) {
   chomp;
   my @fields = split /;/; 
   s/\s+//g for @fields;
   print join ";", @fields, "\n";
}

__DATA__
03139; 5;        IT1234978208; 20150930  ;  CTZ 13/31.12.15;
03137; 6;        IT1234978206; 20151015  ;  CTZ 13/31.11.18;
03134; 8;        IT1234974406; 20151212  ;  CTZ 13/37.13.17;

이제 필드의 모든 공백을 제거하여 다음을 제공합니다.

03139;5;IT1234978208;20150930;CTZ13/31.12.15;
03137;6;IT1234978206;20151015;CTZ13/31.11.18;
03134;8;IT1234974406;20151212;CTZ13/37.13.17;

그러나 선행/후행 공백을 제거하려는 경우:

@필드의 경우 s/^\s+|\s+$//g;

이는 다음과 같이 한 줄로 정리할 수 있습니다.

perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'

어디:

  • -F;구분 기호를 설정합니다
  • -l줄 끝을 자동으로 제거/다시 추가한다고 말합니다.
  • -a자동 분할됨(기본적으로 구분 기호 -F또는 공백에 있음)
  • -e"이 조각을 실행하세요"입니다.

관련 정보