我有一个CSV文件,我需要过滤掉一些不包含某些值的行。因此,我不关心这些行,并希望删除它们或将命令的结果放在新的csv文件中。
这是我的CSV文件的格式:
employeeid,time,homephone,workphone,ssn,insurance,address,state,salary,position,rank,boss,hiredate
现在有些行没有其中某些字段的信息。我如何执行awk或sec命令来读取csv文件中的所有行,并且只将没有字段为空的行放入另一个文件中?或者是否可以用,,
之类的单词替换每个notthere
?我在这里有一些替代词,但这不是百分之百的工作。
到目前为止,我有这样的事情:
sed -e 's/^,/notthere,/' old.csv > new.csv
这几乎没有我想要的东西。如果有人可以帮助我,我将不胜感激。我根本没有使用过linux命令的经验。
谢谢!
答案 0 :(得分:1)
似乎你也可以用文件grep连接逗号:
grep -v ',,' somefile.csv > newfile.csv
编辑:刚刚意识到您在开头和结尾都有字段,您也想要检查。我们可以包含那些带正则表达式的那些,如下:
grep -vE ',,|^,|,$' somefile.csv > newfile.csv
grep -v
表示“反向”,换句话说:打印所有与这些模式不匹配的行:两个逗号在一起,一行开头是逗号,另一行是逗号。这里的|
表示“或”。
答案 1 :(得分:0)
这应该有效:
sed -e 's/,,/,notthere,/' old.csv > new.csv
答案 2 :(得分:0)
某些示例数据会有所帮助,但请尝试跳过包含空字段的行:
awk -F , '{n=0; for (i=1;i<=NF;i++) if ($i=="") n++} n==0' filename
更可读
awk -F , '{
empty=0
for (i=1; i<=NF; i++) {
if ($i == "") {
empty++
}
}
if (empty == 0) {
print
}
}' filename
答案 3 :(得分:0)
值得注意的是,上面的例子正在整个行中“掠过”。另一种方法是使用awk搜索特定列的不存在,如下所示。给定逗号分隔文件,以下脚本仅打印由$2
表示的第2列中具有空值的行。 print $0
部分表示打印整行。
打印第2列为空的所有行,重定向到new.csv
awk -F "," '$2 !~ /./ {print $0}' old.csv > new.csv
另一个相关示例,只有当它与正则表达式[0-9]
awk -F "," '$3 ~ /[0-9]/ {print $3}' old.csv > new.csv