마지막 줄 끝의 "," 필드 구분 기호를 제거하는 방법은 무엇입니까? sed
// awk
선형perl
csv 파일 예:
zoo.cfg,autopurge.purgeInterval,24,
zoo.cfg,autopurge.snapRetainCount,30,,,,
zoo.cfg,clientPort,2181,
zoo.cfg,dataDir,/var/hadoop/zookeeper,
zoo.cfg,initLimit,10,,
zoo.cfg,syncLimit,5,1,1,,
zoo.cfg,tickTime,2000,,,,,,,,,,
예상 출력:
zoo.cfg,autopurge.purgeInterval,24
zoo.cfg,autopurge.snapRetainCount,30
zoo.cfg,clientPort,2181
zoo.cfg,dataDir,/var/hadoop/zookeeper
zoo.cfg,initLimit,10
zoo.cfg,syncLimit,5,1,1
zoo.cfg,tickTime,2000
- 목표 - 각 줄에서 불필요한 끝 필드 구분 기호 "," 또는 ",," 또는 ",,," 등을 제거합니다.
답변1
사용 sed
:
sed 's/,*$//' infile
이는 각 줄 끝에 있는 0개 이상의 쉼표와 일치합니다. 일부 구현의 경우 마지막에 하나 이상을 일치시키도록 sed
지시할 수 있습니다 .sed
sed 's/,\+$//' infile
(휴대용/표준에 해당하는 것은 이므로 또는 동일한 작업을 수행 ,\{1,\}
할 수도 있습니다 ).,,*
,*
또는 GNU와 호환되거나 grep
:
grep -o '.*[^,]'
이렇게 하면 쉼표가 아닌 마지막 문자까지 모든 내용이 인쇄됩니다 -o
(비록 빈 줄을 제거하는 부작용이 있지만).
또는 GNU를 사용하거나 awk
다음을 사용하십시오 mawk
.
awk '1' RS=',*\n' #or
awk '1' RS=',+\n'
이것이 정의이다오른쪽에코코드에스ewline이 보일 때까지 ,*\n
(0개의 쉼표 또는 (1개 이상의 쉼표)) ,+\n
의 정규식 으로 연산자를 사용합니다 .\n
1
하나만 있어요항상 사실조건, 이로 인해 레코드가 인쇄되고 무시됩니다.RS.
또는 perl
:
perl -pe 's/,*$//' #or
perl -pe 's/,+$//'
답변2
$ sed 's/,,*$//' input
이렇게 하면 줄 끝에 있는 모든 쉼표가 아무 것도 없이 대체됩니다(삭제됩니다).
,,*$
줄 끝에 있는 하나 이상의 쉼표와 일치합니다(문자 그대로 "쉼표, 0개 이상의 쉼표").
또 다른 방법은 다음 문제를 해결하는 것입니다.생산하다빈 필드를 출력하지 않도록 데이터입니다.