마지막 줄로 끝나는 필드 구분 기호를 제거하는 방법은 무엇입니까?

마지막 줄로 끝나는 필드 구분 기호를 제거하는 방법은 무엇입니까?

마지막 줄 끝의 "," 필드 구분 기호를 제거하는 방법은 무엇입니까? 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개 이상의 쉼표").

또 다른 방법은 다음 문제를 해결하는 것입니다.생산하다빈 필드를 출력하지 않도록 데이터입니다.

관련 정보