빈 필드가 있는 행을 삭제하는 방법은 무엇입니까?

빈 필드가 있는 행을 삭제하는 방법은 무엇입니까?

여러 열, 쉼표 ","로 구분된 행 수의 CSV 파일이 있습니다.
일부 행에는 하나 또는 두 개의 빈 필드 "열"이 있습니다. 별도의 파일에서 하나 이상의 빈 열이 있는 행을 식별 및/또는 삭제하려면 어떻게 해야 합니까?주문하다.

aaaa,bbbb,cccc,dddd,
,bbbb,cccc,dddd,
aaaa,,cccc,dddd,
aaaa,,,dddd,
,,,dddd,

",,"는 빈 열을 나타냅니다. 이 명령을 시도했지만 작동하지 않습니다!

awk -F, '$1,4~/^$/' filename 

예상되는 출력은 다음과 같아야 합니다.

아아아아, bbbb, cccc, dddd,

답변1

awk -F, '{for(i=1;i<=NF;i++)if($i==""){next}}1' inputfile

답변2

사용밀러( mlr)그리고 그것의filter하위 명령은 하나 이상의 빈 필드가 포함된 모든 레코드를 삭제합니다.

mlr --csv -N filter 'for (k,v in $*) { is_empty(v) { false; break } true }' file.csv

그러면 데이터가 헤더 없는 CSV로 읽혀집니다. 루프는 for각 레코드에 대해 실행되며 작업이 반환되면 filter즉시 레코드를 삭제합니다.is_empty(v)진짜.

질문의 테스트 데이터가 주어지면 모든 레코드에 빈 필드가 하나 이상 포함되어 있으므로 여기에 제공된 명령은 아무것도 출력하지 않습니다.

처음 4개 필드만 확인하려면 테스트를 사용하여 k처음 4개 필드가 비어 있는지만 테스트하세요.

mlr --csv -N filter 'for (k,v in $*) { k <= 4 && is_empty(v) { false; break } true }' file.csv

답변3

이것이 간단한 CSV 파일(따옴표 없음, 헤더 없음, 여러 줄 필드 없음)이라고 가정합니다.

perl -F, -e 'print unless grep {$_ eq ""} @F[0..3]' your-file

첫 번째부터 네 번째 필드 중 하나가 비어 있는 행을 삭제합니다(awk 시도에서 제안한 대로).

코드는 간결하지만 필드가 비어 있는 것을 발견하자마자 확인을 중지하더라도 4개 필드를 모두 중복적으로 확인합니다.

awk -F, '$1 != "" && $2 != "" && $3 != "" && $4 != ""' file.csv

그렇게 콤팩트하지 않아도질문.

둘 다 필드가 4개 미만인 행을 삭제합니다.

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne '.put unless grep {.chars == 0}, .split(",")[0..*-2]'  file

또는:

~$ raku -ne 'given .split(",", :skip-empty) {.join(",").put if .elems > 3}'  file

위의 첫 번째 답변은 @StéphaneChazelas가 제공한 Perl 답변과 매우 유사합니다(고마워요, Stéphane!). 행이 쉼표(후행 공백 열로 해석될 수 있음)로 끝나기 때문에 [0..*-2]인덱스를 사용하여 마지막(빈) 요소를 제거합니다. 이 코드는 마지막 빈 열을 제외하고 채워진 모든 열을 포함하는 행을 유지하고 빈 열이 발견되면 행을 제거합니다.~ 일지라도처음 4개 필드. .split(",")[0..3]요구사항을 처음 4개의 필드(요소)로 제한하려면 이 옵션을 사용하십시오.

참고로 은 *-1Raku의 배열과 유사한 구조의 마지막 요소이며 유사한 [0..*]작업이 수행됩니다(의미'나에게 모든 것을 제공'). Raku에는 "Zen Slices"도 있으므로 .split(",")[]유효한 구문이기도 합니다.

split두 번째 답변은 Raku의 루틴에 ping for :skip-empty대신 사용할 수 있는 매개변수(예: "부사") 가 있다는 사실을 사용합니다 . 따라서 출력에 필요한 열 수를 결정해야 합니다. 여기에는 4개 이상의 열이 필요합니다 .grep.chars == 0.elems > 3

기술적으로 두 번째 대답은 정답입니다. 첫 번째 대답은 후행 쉼표를 그대로 두고 두 번째 대답은 이를 제거하기 때문입니다.

입력 예:

aaaa,bbbb,cccc,dddd,
,bbbb,cccc,dddd,
aaaa,,cccc,dddd,
aaaa,,,dddd,
,,,dddd,

출력 예(첫 번째 답변):

aaaa,bbbb,cccc,dddd,

출력 예(두 번째 답변):

aaaa,bbbb,cccc,dddd

https://docs.raku.org
https://raku.org

관련 정보