如何使用 AWK 从没有数据的 CSV 中删除行

How to remove rows from a CSV with no data using AWK

我正在 linux shell 中使用大型 csv,我将其缩小为 3 列:
物种名称、纬度和经度。

awk -F "\t" '{print ,",",",",}' occurance.csv > three_col.csv


文件最终看起来像这样:

      species         | Lat     | Long   |
----------------------|---------|---------
Leucoraja erinacea    | 41.0748 | 72.9461|
Brevoortia tyrannus   | 39.0748 | 70.9461|
Paralichthys dentatus |         | 73.2354|
Paralichthys dentatus |         |        |
Leucoraja erinacea    | 41.0748 |        |
Brevoortia tyrannus   |         |        |
Brevoortia tyrannus   |         |        |
Paralichthys dentatus | 39.0748 | 70.9461|
Brevoortia tyrannus   | 39.0748 | 70.9461|

然而这就是我想要的样子:注意所有没有纬度或经度数据的物种都已被删除

      species         | Lat     | Long   |
----------------------|---------|---------
Leucoraja erinacea    | 41.0748 | 72.9461|
Brevoortia tyrannus   | 39.0748 | 70.9461|
Paralichthys dentatus | 39.0748 | 70.9461|
Brevoortia tyrannus   | 39.0748 | 70.9461|

我一直在尝试删除缺少 Lat 或 Long 数据的行。使用这样的行:

awk -F "\t" BEGIN '{print ,,}' END '{!=" " && != " " }' three_col.csv > del_blanks.csv

但即使我尝试解决问题时进行了一些小改动,它也会导致此错误

awk: line 1: syntax error at or near end of line

如何删除这些缺少数据的行,这是我需要一个“for”循环吗?

因为我不知道你的 occurance.csv 文件是什么样的,所以这是在黑暗中拍摄的:

awk -F "\t" ' &&  {print ,",",",",}' occurance.csv > three_col.csv

表达式 && 表示:字段 22 和字段 23 都不能为空。过滤掉那些不符合条件的行是一个条件。这是 shorthand for != "" && != "".

也许是这样的?

 mawk '($!NF=","",")!~",,$"' FS='\t' OFS=','

您已经知道只有 10/22/23 字段需要打印,因此您可以先用 [=12=] 这 3 列 already-split 覆盖 OFS

之后只需使用快速正则表达式检查,因为尾部连续 2 个 OFS 是符号 </code> 和 <code> 为空 - 保存打印语句和 pattern-action块。

    awk -F "|" '
        {
        if (substr(,1,1) == "-"){  
          e = ""
        }else{
          e=FS
        }
        gsub(/[ \t]+$/, "", )
        gsub(/[ \t]+$/, "", )
        
        if(length() !=0 && length() !=0){
          printf "%s%s%-9s%s%-8s%s\n", , FS, , FS, , e
        }
}' file.txt

      species         | Lat     | Long   |
----------------------|---------|---------
Leucoraja erinacea    | 41.0748 | 72.9461|
Brevoortia tyrannus   | 39.0748 | 70.9461|
Paralichthys dentatus | 39.0748 | 70.9461|
Brevoortia tyrannus   | 39.0748 | 70.9461|