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



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

awk -F "t" '{print $10,","$22,",",$23}' 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|

我一直在尝试删除那些缺乏后期或长期数据的行。使用像这样的行:

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

但是即使我做了很小的改变也会导致这个错误

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

我怎么能摆脱这些行缺失的数据,这是我需要一个"for"循环?

因为我不知道你的occurrence .csv文件是什么样子的,这是一个黑暗的镜头:

awk -F "t" '$22 && $23 {print $10,","$22,",",$23}' occurance.csv > three_col.csv

表达式$22 && $23表示:字段22和字段23都不能为空。这是过滤掉不符合条件的行的条件。它是$22 != "" && $3 != ""的简写。

    awk -F "|" '
        {
        if (substr($1,1,1) == "-"){  
          e = ""
        }else{
          e=FS
        }
        gsub(/[ t]+$/, "", $2)
        gsub(/[ t]+$/, "", $3)
        
        if(length($2) !=0 && length($3) !=0){
          printf "%s%s%-9s%s%-8s%sn", $1, FS, $2, FS, $3, 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|

也许是这样的?

 mawk '($!NF=$10","$22","$23)!~",,$"' FS='t' OFS=','

你已经知道只有字段10/22/23需要打印,所以你可以先覆盖$0只有3列,已经被OFS分割

之后只需使用快速正则表达式检查,因为尾部连续2个OFS的符号$22$23是空的-保存打印语句和模式操作块。

相关内容

  • 没有找到相关文章

最新更新