이 규칙에 따르면 우리는 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"