문서:
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 hello
및 indiana 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에는 세 가지 가능성이 있습니다.
g
가장 간단한 것(쉼표 앞의 공백 문자와 0번 이상 일치하고, 쉼표 뒤의 공백 문자와 0번 이상 일치하며, 단지 쉼표로 대체하므로 여러 번 사용하므로 옵션을 사용하십시오)글로벌):sed 's/ *, */,/g' file
이 명령의 실행 시간:5.932초
perl -p -e
대신 3.056초sed
[:space:]
모든 공백 문자를 나타내므로 와 동일합니다[ \t\r\n\v\f]
.이것이 POSIX 표준이다:sed 's/[[:space:]]*,[[:space:]]*/,/g' file
이 명령의 실행 시간:9.060초
perl -p -e
대신 10.365초sed
\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을 사용할 때 가장 빠르며 공백뿐만 아니라 탭 중지, 줄 바꿈 등도 대체한다는 점을 고려하세요.