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