[英]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.