簡體   English   中英

如何使用 AWK 從 CSV 中刪除沒有數據的行

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

我正在使用 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|

我一直在嘗試刪除缺少 Lat 或 Long 數據的行。 使用這樣的一行:

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”循環的東西嗎?

因為我不知道你的 occurance.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%s\n", $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需要打印,所以你可以先用那些已經被OFS拆分的 3 列覆蓋$0

之后只需使用快速正則表達式檢查,因為尾部連續 2 個OFS是符號$22$23為空 - 保存打印語句和模式動作塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM