Linux에서 csv 파일을 받았는데 고유한 스키마가 있습니다. 예는 다음과 같습니다.
$ head test.csv
wampproduct,wamp_date,wampregion,region_search_phrase,wamp,date_pull,end_of_month_dt
CD Short-Term WAMP,2010-1-1,MA,MA,0.8763918845487475,201901,2019-01-31
CD Short-Term WAMP,2010-1-1,RI,RI,0.8576695707678873,201901,2019-01-31
CD Short-Term WAMP,2010-1-1,NH,NH,0.9038538021630779,201901,2019-01-31
CD Short-Term WAMP,2010-1-1,CT,CT,0.9699202728104309,201901,2019-01-31
CD Short-Term WAMP,2010-1-1,VT,VT,1.0631714504202636,201901,2019-01-31
CD Short-Term WAMP,2010-1-1,PGH,PGH,0.9517353522520116,201901,2019-01-31
CD Short-Term WAMP,2010-1-1,COM,COM,0.7401903422784099,201901,2019-01-31
CD Short-Term WAMP,2010-1-1,DE,DE,0.8485585323154969,201901,2019-01-31
CD Short-Term WAMP,,2010-1-1,PHI|,PHI,,,,1.0009405151305597,201901,2019-01-31
모든 필드가 xxxx,xxxx,xxxx,xxxx,xxxx,xxx,xxxx 패턴을 따른다는 것을 눈치챘을 것입니다.
그러나 한 행(예제의 마지막 행)에는 잘못된 형식의 데이터(xxxx,,xxxx,xxx|,xxx,,,,xxx,xxxx)가 포함되어 있습니다.
1. 패턴에 대한 정규식을 정의합니다(별도의 파일에 넣는 것이 좋습니다). 2. 원시 데이터에서 일치하지 않는 줄을 찾아냅니다. 마지막 줄을 정리해야합니다.
답변1
실제로 따옴표가 포함된 필드가 없다고 가정합니다.
awk -F, 'NF == 7' file
awk -F, 'NF != 7' file # show the "bad lines"
그러면 쉼표로 구분된 7개의 필드가 포함된 모든 줄이 인쇄됩니다.
이것이 적절한 CSV 파일(참조 필드에 필드 구분 기호가 포함될 수 있음)인 경우 CSV 파서가 필요합니다. 나는 Ruby를 사용하여 다음과 같이 표현하는 것을 좋아합니다.
ruby -rcsv -pe 'next unless CSV.parse_line($_).length == 7' test.csv
ruby -rcsv -pe 'next if CSV.parse_line($_).length == 7' test.csv # show the "bad"
정규식할 수 있는우아한 솔루션을 제공하지만 제 생각에는 여기에는 없습니다.
grep -E '^([^,]+,){6}[^,]+$' test.csv
grep -vE '^([^,]+,){6}[^,]+$' test.csv # show the "bad" lines