2013-08-01 61 views
0

我有一个CSV文件,我需要过滤掉一些不包含某些值的行。因此,我不关心这些行,并希望删除它们或将命令的结果放入新的csv文件中。当4列有空值时从CSV文件中删除行

这是我的CSV文件的格式:

employeeid,time,homephone,workphone,ssn,insurance,address,state,salary,position,rank,boss,hiredate 

现在也有一些行有没有一些信息,这些领域。我将如何执行awk或sec命令来读取csv文件中的所有行,并只将没有字段为空的行放入另一个文件中?或者是否有可能用notthere这样的词来代替每个,,?我有一些词替换在这里,但这不是100%的工作。

到目前为止,我有这样的事情:

sed -e 's/^,/notthere,/' old.csv > new.csv 

这几乎什么也不做,我期待的。如果有人能帮助我,我将不胜感激。我不是那种使用linux命令的经验。

谢谢!

回答

1

好像你也可以grep文件中连接的逗号:

grep -v ',,' somefile.csv > newfile.csv 

编辑:刚刚意识到你有开始和结束的领域,你也想检查。我们可以包括那些与正则表达式,像这样:

grep -vE ',,|^,|,$' somefile.csv > newfile.csv 

grep -v手段“逆”,换句话说:打印不这些模式匹配的所有行:两个逗号一起,在该行的开头逗号,行末的逗号。这里的|表示“或”。

+0

非常感谢!做事的相反方式很有趣,同时也适用。现在我可以继续使用我需要的其他代码。谢谢! – Tastybrownies

+0

没问题。我实际上一直使用'grep -v'和'grep -vE'。 – erewok

0

这应该工作:

sed -e 's/,,/,notthere,/' old.csv > new.csv 
+1

应该添加'-e '/ ^,/ notthere,/'-e's /,$ /,notthere /''检查第一个字段和最后一个字段的空格 –

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 
0

值得注意的是,上面的例子在整个行中都是“grepping”。另一种方法是使用awk搜索不存在的特定列,如下所示。给定逗号分隔的文件,下面的脚本仅打印第2列中具有空值的行,由$2表示。部分的print $0表示打印整个行。

打印的所有行,其中第2栏是空的,重定向到new.csv

awk -F "," '$2 !~ /./ {print $0}' old.csv > new.csv 

另一个相关的例子中,打印第3栏当只有它匹配正则表达式[0-9]

awk -F "," '$3 ~ /[0-9]/ {print $3}' old.csv > new.csv