Bash sed:如何删除与特定字符串匹配的整行?

Bash sed:如何删除与特定字符串匹配的整行?,bash,sed,Bash,Sed,我在删除sample.txt中的整行时遇到问题 cat sample.txt XYZ -2.4 DNW ZYY -2.4 138 ZZZ -3.4 200 ZZZ -2.4 DNW sed '/DNW/d' sample.txt >> output.txt cat output.txt XYZ -2.4 #removes the DNW, but not the

我在删除sample.txt中的整行时遇到问题

   cat sample.txt

   XYZ   -2.4   DNW
   ZYY   -2.4   138
   ZZZ   -3.4   200
   ZZZ   -2.4   DNW 

  sed '/DNW/d' sample.txt >> output.txt

  cat output.txt 

   XYZ   -2.4                 #removes the DNW, but not the entire line
   ZYY   -2.4   138
   ZZZ   -3.4   200
   ZZZ   -2.4  
我需要的是:

    cat output.txt 


   ZYY   -2.4   138      #Need the entire lines removed that matched the 3rd column string DNW
   ZZZ   -3.4   200
我是bash新手,想知道是否有一个选项可以删除文本文件中与搜索条件匹配的整行内容

谢谢大家!

p、 我对主要使用bash的可能解决方案感兴趣。不过,我也开始使用python,如果有解决方案,我也很乐意学习

更新

事实证明,我原来的sample.txt文件格式不正确。下面的代码修复了这个问题,因为它将行更改为逗号分隔的格式(例如,x,y,c=视为一行)


干杯,谢谢你的帮助

你说得差不多对了:


sed'/DNW/d'sample.txt>>output.txt

您的操作几乎正确:


sed'/DNW/d'sample.txt>>output.txt

使用
grep
sed
更容易:

grep -v DNW sample.txt >> output.txt
如果您想在Python中执行此操作,它会更加详细,但实际上不会太难:

with open('sample.txt') as fin, open('output.txt', 'a') as fout:
    for line in fin:
        if 'DNW' not in line:
            fout.write(fin)
或者,如果您希望它更简洁(但新手可能更难理解):


使用
grep
比使用
sed
更容易:

grep -v DNW sample.txt >> output.txt
如果您想在Python中执行此操作,它会更加详细,但实际上不会太难:

with open('sample.txt') as fin, open('output.txt', 'a') as fout:
    for line in fin:
        if 'DNW' not in line:
            fout.write(fin)
或者,如果您希望它更简洁(但新手可能更难理解):


您的sed命令在OSX上对我有效。尝试超级明确,并尝试以下操作:

sed '/^.*DNW.*$/d' sample.txt >> output.txt

您的sed命令在OSX上对我有效。尝试超级明确,并尝试以下操作:

sed '/^.*DNW.*$/d' sample.txt >> output.txt

您也可以使用
awk

awk '!/DNW/' file
   ZYY   -2.4   138
   ZZZ   -3.4   200

您也可以使用
awk

awk '!/DNW/' file
   ZYY   -2.4   138
   ZZZ   -3.4   200


我认为在这种情况下,
grep-v
sed
更容易。sed命令是正确的。您正在附加到输出文件,因此:sed命令之前“output.txt”中有什么内容?output.txt文件中没有任何内容,只是告诉它将结果写入其中。可能不是正确的方法?
>
意味着附加到现有文件(如果不存在则创建)
表示写入(如果存在,则截断)。请参见@user1698774:shell方向上的
>
之间的差异实际上与Python(以及具有类似于
的函数的大多数其他语言)中的
'a'
'w'
之间的差异相同,这就是为什么格伦·杰克曼在对我的回答的评论中问你关于
'a'
,在对问题的评论中问你关于
'>'
。如果您在文件末尾追加,然后查看前几行,它们仍然是旧的、不正确的版本。我认为在这种情况下,
grep-v
sed
更容易。sed命令是正确的。您正在附加到输出文件,因此:sed命令之前“output.txt”中有什么内容?output.txt文件中没有任何内容,只是告诉它将结果写入其中。可能不是正确的方法?
>
意味着附加到现有文件(如果不存在则创建)
表示写入(如果存在,则截断)。请参见@user1698774:shell方向上的
>
之间的差异实际上与Python(以及具有类似于
的函数的大多数其他语言)中的
'a'
'w'
之间的差异相同,这就是为什么格伦·杰克曼在对我的回答的评论中问你关于
'a'
,在对问题的评论中问你关于
'>'
。如果你在文件的末尾追加内容,那么看看前几行,它们仍然是旧的、不正确的版本。这是一个打字错误。谢谢你!代码仍然只会删除搜索的字符串,而不会删除整行。这很奇怪。你有什么操作系统和sed版本?我在OSX 10.9.4上;不确定是什么sed-verison(尝试了sed-V,但没有成功)。尝试使用
sed-e
,并最终使用
--posix
,没有理由认为此sed操作仅删除工作(没有针对该操作的操作,
d
仅删除整行)。您可以使用
进行调试;l/DNW/d'
当然,没有隐藏的新行(例如来自WinDOS文件源)@user1698774:与Linux不同,*BSD(包括OS X)将核心用户区工具(如
sed
)视为操作系统的一部分,而不是单独的项目,因此它们没有独立的版本号。与OSX10.9.4的sed版本号最接近的是“OSX10.9.4”、“Darwin13.3.0”或“FreeBSD6.0”。这是一个打字错误。谢谢你!代码仍然只会删除搜索的字符串,而不会删除整行。这很奇怪。你有什么操作系统和sed版本?我在OSX 10.9.4上;不确定是什么sed-verison(尝试了sed-V,但没有成功)。尝试使用
sed-e
,并最终使用
--posix
,没有理由认为此sed操作仅删除工作(没有针对该操作的操作,
d
仅删除整行)。您可以使用
进行调试;l/DNW/d'
当然,没有隐藏的新行(例如来自WinDOS文件源)@user1698774:与Linux不同,*BSD(包括OS X)将核心用户区工具(如
sed
)视为操作系统的一部分,而不是单独的项目,因此它们没有独立的版本号。与OS X 10.9.4的sed版本号最接近的是“OS X 10.9.4”、“Darwin 13.3.0”或“FreeBSD 6.0”。这两个版本仍然只删除实际的“DNW”字符串,但不删除整行。@user1698774,将
open('output.txt','a')
更改为
open('output.txt','w')
,然后得到什么?@user1698774:No,所有这三个肯定会删除整个线路。Python代码不可能写出经过编辑的行;它要么按原样写行,要么什么也不写。我可以和您共享示例文件吗?我已经运行了exac代码