다음과 같이 빈 줄이 많이 포함된 .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에 대해서는 모릅니다. 어떤 조언이라도 대단히 감사하겠습니다!
답변1
grep의 (역 일치) 패턴을 사용하여 -v
이를 수행 할 수 있습니다.
grep -v '^$' old-file.csv > new-file.csv
쉘 리디렉션이 작동하는 방식으로 인해 이러한 파일은 서로 다른 파일이어야 합니다. 입력 파일을 읽기 전에 출력 파일이 열리고 비워집니다. moreutils(Mac OS X에서는 기본이 아님)가 있는 경우 sponge
다음 방법을 사용하여 이 문제를 해결할 수 있습니다.
grep -v '^$' file.csv | sponge file.csv
하지만 물론 뭔가 잘못되면 되돌리기가 어렵습니다.
"빈 줄"에 실제로 공백이 포함될 수 있는 경우(그런 것처럼 들리지만) 다음을 사용할 수 있습니다.
egrep -v '^[[:space:]]*$' old-file.csv > new-file.csv
이렇게 하면 빈 줄은 물론 공백만 포함된 줄도 무시됩니다. 물론 sponge
같은 방법으로 변환할 수도 있습니다.
답변2
가장 간단한 옵션은 입니다 grep .
. 여기서 점은 "무엇이든 일치"를 의미하므로 행이 비어 있으면 일치하지 않습니다. 그렇지 않으면 전체 줄을 그대로 인쇄합니다.
답변3
빈 줄을 제거하려면,제자리에, ksh93 사용:
sed '/./!d' file 1<>; file
리디렉션 연산자는 ksh93에 고유하며 명령이 종료된 후 ksh가 파일을 자르는 점을 제외하면 <>;
표준 연산자와 동일합니다 .<>
sed '/./!d'
작성하는 방법은 복잡 grep .
하지만, 불행하게도 GNU grep은 표준 출력이 표준 입력과 동일한 파일을 가리키는 경우 적어도 불평할 것입니다. 다음과 같이 작성할 수 있다고 말할 수 있습니다.
grep . file | cat 1<>; file
그러나 불행하게도 ksh93(적어도 내 버전(93u+))에는 이 경우 파일 길이가 0으로 잘리는 것처럼 보이는 버그가 있습니다.
grep . file | { cat; } 1<>; file
오류를 해결한 것 같지만 이제는 sed 명령보다 훨씬 더 복잡해졌습니다.
답변4
귀하의 질문에 대한 의견의 설명을 바탕으로 예를 들면 다음과 같습니다.
awk -v RS= -v ORS= 1
당신이 원하는 것을 할 수도 있습니다.
비어있는기록 구분 기호awk
레코드가 단락(일련의 빈 줄로 구분됨)임을 알려주는 특별한 경우입니다 . 설정출력 레코드 구분 기호빈 문자열은 또한 이러한 단락의 내용(구분 기호 없음)이 연결된다는 의미이기도 합니다. 1
딱 하나만진짜각 기록에 대한 조건을 인쇄합니다.
그러나 이렇게 하면 후행 개행 문자가 생략되므로 다음과 같이 할 수 있습니다.
awk -v RS= -v ORS= '1;END{if (NR) printf "\n"}'