AWK는 CSV에서 두 개 이상의 빈 필드가 있는 행을 제거합니까? [폐쇄]

AWK는 CSV에서 두 개 이상의 빈 필드가 있는 행을 제거합니까? [폐쇄]

이름이 다음과 같은 파일이 있습니다 new2.csv.

101583815|1605227222|1605227234|412_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000|MARIA
101583815||2005227222|412_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000
101583815|   ||420_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000
101583815|   |4905227222|420_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000
101578445|HOLA|1605434338|412_99_0123259149|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|8000|0|0|8000
101583816||1805434338|420_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000

두 번째 또는 세 번째 열에 값이 있는 행만 유지하고 싶습니다. 나는 이전에 시도했습니다:

awk -F "|" '(NR>1) && (($2$3)~/[^[:space:]]/)' new2.csv

그러나 이것은 2번째 줄을 인쇄합니다.

원하는 출력: (

101583815|1605227222|1605227234|412_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000|MARIA
101578445|HOLA|1605434338|412_99_0123259149|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|8000|0|0|8000

답변1

제공한 예제 파일을 사용하고 원하는 출력을 기반으로 필드가 에 의해 정의되었다고 가정하면 |두 번째 및 세 번째 필드가 비어 있지 않거나 공백일 뿐인 행을 인쇄하려고 합니다. 그렇다면 다음을 수행해야 합니다.

$ awk -F "|" '$2~/[^[:space:]]/ && $3~/[^[:space:]]/' new2.csv
101583815|1605227222|1605227234|412_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000|MARIA
101578445|HOLA|1605434338|412_99_0123259149|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|8000|0|0|8000

헤더도 건너뛰려면 다음을 사용하세요.

awk -F "|" 'NR>1 && $2~/[^[:space:]]/ && $3~/[^[:space:]]/' new2.csv

정말 라인을 원하신다면누구나두번째또는세 번째,또는둘 다 null이 아닌 경우 다음을 사용합니다.

awk -F "|" 'NR>1 && ($2~/[^[:space:]]/ || $3~/[^[:space:]]/)' new2.csv

답변2

원하는 출력을 얻으려면( retain rows that have values in the 2nd or 3rd column):

$ awk -F'[[:space:]]*[|][[:space:]]*' '($2$3) != ""' file
101583815|1605227222|1605227234|412_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000|MARIA
101583815||2005227222|412_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000
101583815|   |4905227222|420_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000
101578445|HOLA|1605434338|412_99_0123259149|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|8000|0|0|8000
101583816||1805434338|420_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000

하지만 예제에 표시된 출력을 얻으려면(두 번째 값이 있는 행을 유지하세요)그리고세 번째 열):

$ awk -F'[[:space:]]*[|][[:space:]]*' '($2 != "") && ($3 != "")' file
101583815|1605227222|1605227234|412_99_0122818689|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|10000|0|0|10000|MARIA
101578445|HOLA|1605434338|412_99_0123259149|2020-09-24 00:00:00.000|2020-10-09 00:00:00.000|0|8000|0|0|8000

관련 정보