5개의 값이 있는 "csv" 행만 캡처하는 방법

5개의 값이 있는 "csv" 행만 캡처하는 방법

이 규칙에 따르면 우리는 5개의 값이 있는 "csv" 행만 캡처하려고 합니다.

"","","","",""

예:

more conf.csv

"linux02","cluster26","api2-thrift-apiconf","api.driver.memory",
"linux02","cluster26","api2-thrift-apiconf","api.executor.cores"
"linux02","cluster26","api.executor.instances","2"

"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.cores","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.instances","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.sql.shuffle.partitions","141"
"linux02","cluster26","api2-thrift-apiconf","api.dynamicAllocation.enabled","true"

"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","api2-thrift-apiconf","api.executor.memory"
"linux02","cluster26","api2-thrift-apiconf","api.executor.cores"
"linux02","cluster26","api.executor.instances","2"

예상 출력:

"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.cores","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.instances","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.sql.shuffle.partitions","141"
"linux02","cluster26","api2-thrift-apiconf","api.dynamicAllocation.enabled","true"

답변1

사용:

awk -F "," 'NF==5 {print $0}' conf.csv

5개의 필드가 포함된 행을 인쇄합니다. 그러나 이 줄은 다음과 같습니다.

"linux02","cluster26","api2-thrift-apiconf","api.driver.memory",

마지막 쉼표가 스푸핑되어 오류가 발생합니다.해당 행에 다섯 번째 필드가 있다고 믿으세요.

답변2

CSV를 올바르게 처리하기 위해 CSV 파서는 다음을 수행합니다.

ruby -rcsv -e '
  data = CSV.foreach(ARGV.shift) {|row|
    if row.size == 5 and row.none? {|elem| elem.nil?}
      puts CSV.generate_line(row, :force_quotes=>true)
    end
  }
' conf.csv

답변3

grep -E '(".+",){4}".+"' Csv.file
"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.cores","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.instances","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.sql.shuffle.partitions","141"
"linux02","cluster26","api2-thrift-apiconf","api.dynamicAllocation.enabled","true"
"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","api2-thrift-apiconf","api.executor.memory"

-E확장 정규 표현식이 사용되며, 4번 검색 ".+",하고 1번을 추가합니다 ".+". 하지만 시도한 내용을 제공해야 합니다.

노트:.+5개 필드(또는 빈 필드)가 있는 행을 원할 경우 비어 있지 않은 문자열을 검색하여 다음 +으로 바꾸곤 했습니다 *.

grep -E '(".*",){4}".*"' Csv.file

답변4

분석 데이터밀러( mlr) 헤더가 없고 들쭉날쭉한(레코드당 필드 수가 다른) CSV 파일로 정확히 5개의 필드가 있는 모든 레코드를 출력합니다.

$ mlr --csv -N --ragged filter 'NF == 5' file
linux02,cluster26,api2-thrift-apiconf,api.driver.memory,
linux02,cluster26,api2-thrift-apiconf,api.driver.memory,2
linux02,cluster26,api2-thrift-apiconf,api.executor.cores,2
linux02,cluster26,api2-thrift-apiconf,api.executor.instances,2
linux02,cluster26,api2-thrift-apiconf,api.executor.memory,2
linux02,cluster26,api2-thrift-apiconf,api.sql.shuffle.partitions,141
linux02,cluster26,api2-thrift-apiconf,api.dynamicAllocation.enabled,true

주어진 입력에 빈 다섯 번째 필드가 있는 레코드가 포함되어 있기 때문에 예상 출력과 비교하여 하나의 추가 레코드를 얻습니다.

다섯 번째 필드가 비어 있는 레코드를 제외하고 다음과 같이 모든 필드를 따옴표로 묶을 수 있습니다.

$ mlr --csv -N --ragged --quote-all filter 'NF == 5 && !is_empty($5)' file
"linux02","cluster26","api2-thrift-apiconf","api.driver.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.cores","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.instances","2"
"linux02","cluster26","api2-thrift-apiconf","api.executor.memory","2"
"linux02","cluster26","api2-thrift-apiconf","api.sql.shuffle.partitions","141"
"linux02","cluster26","api2-thrift-apiconf","api.dynamicAllocation.enabled","true"

관련 정보