공백을 제거하여 패턴을 변경하시겠습니까?

공백을 제거하여 패턴을 변경하시겠습니까?

문서:

hi hello,new york,      ,  ,brazil site   ,brazil
january,month is feb   ,      , ,indiana jones

일:

  • 공백 이외의 문자가 없으면 두 쉼표(예: ,) 사이의 가로 공백(공백 및 탭)이 모두 제거됩니다. 그래서 그것은 다음과 같습니다:

    hi hello,new york,,,brazil site   ,brazil
    january,month is feb   ,,,indiana jones
    
  • 또한 각 인수에서 후행 또는 선행 가로 공백(공백 및 탭)을 제거하여 다음과 같이 보이도록 합니다.

    최종 출력:

    hi hello,new york,,,brazil site,brazil
    january,month is feb,,,indiana jones
    

참고: 매개변수 자체에는 hi helloindiana jones등의 공백이 있으며 이는 영향을 받지 않아야 하며 hihello또는 등이 됩니다 indianajones. 가능하다면 awk를 사용하여 해결하고, 그렇지 않으면 sed를 사용할 수도 있습니다.

다음과 같이 sed를 사용하여 첫 번째 작업을 수행할 수 없습니다.

sed -n 's/,[[:blank:]],/,,/gp' file

하지만 나는 이것을 출력으로 얻습니다.

january,month is feb   ,      ,,indiana jones

답변1

그래서 당신은 awk에게 묻고 있습니다 :

awk '{$1=$1};gsub(" ,",",")'

괜찮나요? 이는 데이터에서 쉼표 안의 반복되는 공백을 제거하는 부작용이 있으며 이는 영어에는 문제가 되지 않을 수 있습니다.

답변2

sed에는 세 가지 가능성이 있습니다.

  1. g가장 간단한 것(쉼표 앞의 공백 문자와 0번 이상 일치하고, 쉼표 뒤의 공백 문자와 0번 이상 일치하며, 단지 쉼표로 대체하므로 여러 번 사용하므로 옵션을 사용하십시오)글로벌):

    sed 's/ *, */,/g' file
    

    이 명령의 실행 시간:5.932초 perl -p -e대신 3.056초sed

  2. [:space:]모든 공백 문자를 나타내므로 와 동일합니다 [ \t\r\n\v\f].이것이 POSIX 표준이다:

    sed 's/[[:space:]]*,[[:space:]]*/,/g' file
    

    이 명령의 실행 시간:9.060초 perl -p -e대신 10.365초sed

  3. \s마지막으로 다음과 동일 하지만 을 의미하는 축약된 버전이 있습니다 .[:space:]펄 구문:

    sed 's/\s*,\s*/,/g' file
    

    이 명령의 실행 시간:6.126초 perl -p -e대신 10.507초sed

이 모든 것이 다음으로 이어질 것입니다.

hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones

이것시간200만 줄의 파일로 처리됩니다(100만 개의 질문 예제 텍스트 포함). 파일 크기는 97MB입니다.

첫 번째 명령이 가장 빠른 것 같습니다 sed. 마지막 명령은 Perl을 사용할 때 가장 빠르며 공백뿐만 아니라 탭 중지, 줄 바꿈 등도 대체한다는 점을 고려하세요.

관련 정보