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

如果你真的想要线任何一个第二个或者第三个,或者两者都非空,使用:

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

相关内容