使用 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
我有一个用逗号分隔数据的数据集,这里是一个例子:
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
:
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