我有一个以逗号分隔的文件。我必须找到特定的文本,然后删除完整的行。
例如
123,aaa,bbb,888,8881
124,bbb,ccc,999,8881
125,ccc,ddd,888,8883
我必须删除包含 888 的行。
答案1
使用sed
,
sed '/888/d' filename
您可以使用-i
选项来就地编辑文件,例如
sed -i.bak '/888/d' filename
笔记 : .bak
将保留原始文件的备份。
假设您想删除包含888
特定列的行,那么您需要使用,
awk -F"," '$4 != "888"' filename
答案2
使用grep
grep -vw '888' infile.csv > outfile.csv
如果您想就地编辑,
sed -i.bak '/\b888\b/d' infile.csv
编辑:
删除888
仅包含第 4 列的行
sed -i.bak -r '/^(([^,]+,){3})888,/d' infile.csv
答案3
IMO,使用printf
管道命令ed
比sed -i
.
printf '%s\n' 'g/,888,/d' 'w' | ed -s msalik.txt
第一个 argprintf
告诉它打印由换行符 ( \n
) 分隔的每个剩余参数。
最后两个论点实际上都不需要引用。我只是引用它们作为示例 - 有些ed
命令需要引用。
为什么ed
优于sed -i
?
与 不同的是ed
,sed -i
它不进行真正的就地编辑。它创建一个临时输出文件,然后将其重命名为原始文件。这有两个潜在的副作用:
umask
由于创建临时文件所用的原因,文件的权限可能会更改。如果sed -i
脚本由不同的用户运行(当然,该用户对文件和目录具有适当的 RW 访问权限),则即使所有权或组也可能会更改。替换文件将具有不同的索引节点。这将破坏硬链接。