1

我有一个 CSV 文件,我需要过滤掉一些不包含某些值的行。因此,我不关心这些行,而是想删除它们或将命令的结果放入新的 csv 文件中。

这是我的 CSV 文件的格式:

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

现在有一些行没有这些字段中的一些信息。我将如何执行 awk 或 sec 命令来读取 csv 文件中的所有行,并且只将没有字段为空的行放入另一个文件中?或者是否可以,,用类似的单词替换every notthere?我在这里进行了一些替换,但这并不是 100% 有效。

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

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

这几乎没有我正在寻找的任何东西。如果有人可以帮助我,我将不胜感激。我根本没有使用 linux 命令的经验。

谢谢!

4

4 回答 4

2

似乎您也可以 grep 文件以获取连接的逗号:

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

编辑:刚刚意识到你在开头和结尾都有你想要检查的字段。我们可以使用正则表达式包括那些,如下所示:

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

grep -v表示“反向”,换句话说:打印所有与这些模式不匹配的行:两个逗号在一起,一个逗号在行首,一个逗号在行尾。这里的|意思是“或”。

于 2013-08-01T18:11:29.037 回答
0

Some sample data would have helped, but try this to skip lines with empty fields:

awk -F , '{n=0; for (i=1;i<=NF;i++) if ($i=="") n++} n==0' filename

More readably

awk -F , '{
    empty=0
    for (i=1; i<=NF; i++) {
        if ($i == "") {
            empty++
        }
    }
    if (empty == 0) {
        print
    }
}' filename
于 2013-08-01T18:07:53.050 回答
0

这应该有效:

sed -e 's/,,/,notthere,/' old.csv > new.csv
于 2013-08-01T18:03:09.153 回答
0

值得注意的是,上面的例子是在整个行中“grepping”的。另一种方法是使用 awk 搜索特定列是否不存在,如下所示。给定一个逗号分隔的文件,下面的脚本只打印第 2 列中由 . 表示的空值的行$2print $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
于 2013-08-01T20:10:01.107 回答