빈 줄을 제거하기 위해 텍스트 파일을 필터링하는 좋은 방법은 무엇입니까? lorem ipsum “,”2″,”3″,”4” 내가

빈 줄이 여러 개있는 .csv 파일 (Mac)이 있습니다. 예 :

"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum 

lorem ipsum ","2","3","4"
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum 

lorem ipsum ","2","3","4"

내가 변환하고 싶은 것 :

"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4"
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum  lorem ipsum ","2","3","4"

라이너가 하나 있어야한다는 것을 알고 있지만 awk 나 sed는 모릅니다. 어떤 팁이라도 대단히 감사합니다!



답변

grep -v(반전 일치) 모드를 사용하여 다음을 수행 할 수 있습니다 .

grep -v '^$' old-file.csv > new-file.csv

셸 리디렉션이 작동하는 방식 때문에 파일이 서로 달라야합니다. 입력 파일을 읽기 전에 출력 파일을 열고 비 웁니다. 더 많은 유틸리티가있는 경우 (Mac OS X에서는 기본적으로 아님) sponge이 문제를 해결 하는 데 사용할 수 있습니다 .

grep -v '^$' file.csv | sponge file.csv

그러나 물론 무언가 잘못되면 되돌아 가기가 더 어려워집니다.

“공백 줄”에 실제로 공백이 포함되어있는 경우 (공백과 같이 들림) 대신 다음을 사용할 수 있습니다.

egrep -v '^[[:space:]]*$' old-file.csv > new-file.csv

공백 만 포함하고 공백 만 포함하는 행은 무시합니다. 물론 동일한 sponge변환을 수행 할 수 있습니다 .


답변

가장 쉬운 옵션은 grep .입니다. 여기에서 점은 “무엇이든 일치”를 의미하므로 선이 비어 있으면 일치하지 않습니다. 그렇지 않으면 그대로 전체 줄을 인쇄합니다.


답변

ksh93을 사용하여 빈 줄 을 제자리에서 제거하려면 다음을 수행하십시오 .

sed '/./!d' file 1<>; file

<>;리디렉션 연산자 ksh93의 특정 표준과 동일 <>명령 후 파일이 종료되었는지의 KSH 자릅니다 제외 연산자.

sed '/./!d'은 복잡한 작성 방법 grep .이지만 불행히도 GNU grep은 stdout이 stdin과 동일한 파일을 가리키는 경우 적어도 불평합니다. 당신은 하나를 쓸 수 있다고 말할 것입니다 :

grep . file | cat 1<>; file

그러나 불행히도 ksh93 (적어도 내 버전 (93u +))에는 파일이 길이가 0으로 잘리는 것처럼 보이는 버그가 있습니다.

grep . file | { cat; } 1<>; file

이 버그를 해결하는 것처럼 보이지만 sed 명령보다 훨씬 복잡합니다.


답변

여기에 Perl하나의 라이너가 있습니다.

perl -pi -e 's/^\s*\n//' yourfile

편집 : 아래 ruakh의 의견을 기반으로 코드가 개선되었습니다.


답변

귀하의 질문에 대한 의견의 설명을 바탕으로,

awk -v RS= -v ORS= 1

당신이 원하는 것을 할 수 있습니다.

레코드 구분 기호awk레코드가 단락 (빈 행 시퀀스로 구분됨) 임을 알려주는 특수한 경우입니다 . 출력 레코드 구분 기호 를 빈 문자열로 설정하면 해당 단락의 내용이 구분 기호없이 연결되어 있어야합니다. 모든 레코드를 인쇄하기 1위한 진정한 조건입니다.

그러나 후행 줄 바꿈을 생략하므로 다음을 수행 할 수 있습니다.

awk -v RS= -v ORS= '1;END{if (NR) printf "\n"}'

답변

파일을 제공하면이 작업이 쉬워졌지만 안타깝게도 공유 할 수없는 기밀 정보가 포함되어있었습니다. 그동안 나는 속임수를 쓰는 것처럼 보이는 루비 스크립트를 작성했습니다.

require 'csv'
c = CSV.open("outfile1.csv", "w")
CSV.foreach("data.csv", :encoding => 'windows-1251:utf-8') do |row|
  row = row.map { |a| a.class == String ? a.gsub(/\r/, '') : a}
  c << row
end
c.close

도와 주셔서 감사합니다!


답변

awk '
    length == 0 {next} 
    /^[^"]/ && /"$/ {print; next} 
    {printf("%s", $0)}
' filename

생산

"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4"
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4"