여러 열, 쉼표 ","로 구분된 행 수의 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개의 필드(요소)로 제한하려면 이 옵션을 사용하십시오.
참고로 은 *-1
Raku의 배열과 유사한 구조의 마지막 요소이며 유사한 [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