使用 sed 省略数据集的特定行

using sed to omit specific lines of a dataset

我有一个用逗号分隔数据的数据集,这里是一个例子:

id, date of birth, grade, explusion, serious misdemeanor, info
123,2005-01-01,5.36,1,1, 
582,1999-05-12,8.51,0,1
9274,2001-25-12,9.65,0,0,pass
21,2006-14-05,0.53,4,1,repeat

情况是,我需要使用 sed 实现一个正则表达式,以从学生数据集中删除所有那些没有任何解释或严重轻罪的记录。所以执行命令的结果将是前一个样本的第三个寄存器。

sed -i "/^*,*,*,0,0$/d" file.csv

知道缺少什么吗?

您可能想使用 awk 检查字段 4 和 5,并且只检查不在 0:

的 return 行
awk -F, ' != 0 ||   != 0' file.csv > output.csv

或者,获取其他行:

awk -F, ' == 0 &&   == 0' file.csv > output.csv

参见online demo

您也可以使用

sed -i '/,0,0$/d' file.csv

这样,您将删除所有以 ,0,0.

结尾的行

参见online demo

#!/bin/bash
s='id, date of birth, grade, explusion, serious misdemeanor
123,2005-01-01,5.36,1,1
582,1999-05-12,8.51,0,1
9274,2001-25-12,9.65,0,0
21,2006-14-05,0.53,4,1'
sed '/,0,0$/d' <<< "$s"

输出:

id, date of birth, grade, explusion, serious misdemeanor
123,2005-01-01,5.36,1,1
582,1999-05-12,8.51,0,1
21,2006-14-05,0.53,4,1

要查看其他行,请使用像

这样的反向命令
sed  -i -n '/,0,0$/p' file.csv

它将打印以,0,0结尾的行。

您似乎认为 * 表示“任何”,但它表示“尽可能多地重复前面的正则表达式零次或多次”。正则表达式不同于许多 shell 和搜索引擎中使用的通配符,其中 * 通常表示“任何字符串”。

正则表达式 .* 的意思是“任何字符,重复尽可能多的次数”,但在这种情况下你显然是指 [^,]* 意思是“任何不是逗号的字符” , 重复尽可能多的次数。"

然而,sed 会很乐意匹配子串,所以

sed -i '/,0,0$/d' file.csv

应该可以,或者等同于

grep -v ',0,0$' file.csv >temp && mv temp file.csv