当4列具有空值时,从CSV文件中删除行

时间:2013-08-01 17:56:38

标签: unix csv sed

我有一个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命令的经验。

谢谢!

4 个答案:

答案 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]

匹配时才打印第3列
awk -F "," '$3 ~ /[0-9]/ {print $3}' old.csv > new.csv