我正在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
是空的-保存打印语句和模式操作块。