Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Bash+;过滤,删除整个句子_Python_Bash_Awk_Sed_Grep - Fatal编程技术网

Python Bash+;过滤,删除整个句子

Python Bash+;过滤,删除整个句子,python,bash,awk,sed,grep,Python,Bash,Awk,Sed,Grep,输入(文件): 过滤器(文件): 期望输出: Let leave untouched Also this word1 let it stay 我看到了一些awk解决方案,其中过滤器与具体记录相连接,但如何在过滤器中的字符串不在特定位置时过滤掉 简而言之,若过滤器文件中的行是主(输入)文件中的行的子字符串,那个么该行应该被过滤掉 我有python解决方案,易于在python中实现的想法,仍然很好奇awk oneliner能否证明一些概念证明,比如在某些情况下awk优于python imp

输入(文件):

过滤器(文件):

期望输出:

Let leave untouched  
Also this word1 let it stay  
我看到了一些awk解决方案,其中过滤器与具体记录相连接,但如何在过滤器中的字符串不在特定位置时过滤掉

简而言之,若过滤器文件中的行是主(输入)文件中的行的子字符串,那个么该行应该被过滤掉

我有python解决方案,易于在python中实现的想法,仍然很好奇awk oneliner能否证明一些概念证明,比如在某些情况下awk优于python

import codecs

lmyfilter = []
ffilter = codecs.open('filter', 'r', 'utf-8')
for line in ffilter:
    line = line.strip('\n')
    lmyfilter.append(line)
ffilter.close()

finput = codecs.open('input', 'r', 'utf-8')
for line in finput:
        line = line.strip('\n')
        letitpass = True
        for filteritem in lmyfilter:
            if filteritem.lower().strip('!"&\'()*,-./:;?<>[\]_{}«·»‑–—―‖‘’“”…′$#') in line.lower():
                letitpass = False
        if letitpass:
            print(line)
finput.close()  
导入编解码器
lmyfilter=[]
ffilter=codec.open('filter','r','utf-8')
对于ffilter中的行:
line=line.strip('\n')
lmyfilter.append(行)
ffilter.close()
finput=codecs.open('input','r','utf-8')
对于finput中的行:
line=line.strip('\n')
LettPass=真
对于lmyfilter中的filteritem:
如果filteritem.lower().strip(“!”&\'()*,-./:;?[\]{}«·»‑-―‖“…'$\”)在行中。lower():
LettPass=False
如果是LettPass:
打印(行)
finput.close()
根据falcon eye的说法,我必须增加新的要求:
*区分大小写关闭
*解决方案需要基于utf-8
*忽略单词左侧或右侧的标点符号

*awk现在不是严格要求的,但命令行解决方案是拯救awk

$ awk 'NR==FNR{fs[$0]; next}
              {for(f in fs) if($0~f) next; print}' filter file    

Let leave untouched  
Also this word1 let it stay

如果过滤器文件维护良好(理想情况下是通过一些自动化操作——如果是手工操作,请确保没有尾随空格或DOS回车、没有打字错误、没有注释、所有正则表达式特殊值都正确转义等),您可以将其转换为
sed
grep-E
脚本

tr '\n' '|' <filter |
sed 's/\|$//;s/.*/(^|[^[:alnum:]])(&)([^[:alnum:]]|$)/' |
grep -Evif - input

解决这类问题的通常方法是

grep -vif filter input.txt
但是,这也会删除该行

还有这个词,让它停留


其中包含模式
this
。是否要在使用后丢弃每个模式?

如果
other
this
位于
filter
而不是
word2d
中,则会失败。正则表达式数组上的内部循环会让我产生足够多的麻烦,从而得出不同的答案。我想是same idea可以重构为Awk脚本。嗯,不确定你是否应该留下评论,充其量也有点自以为是。编辑你的问题,展示你到目前为止所做的尝试,并澄清你对你的领域中的“单词”是什么、哪些字符构成和/或单独的“单词”的要求,然后显示更好地代表所有用例的输入/输出。签名,精灵。是的,你是对的!询问qustion的主要目的是使用它通过命令行过滤twitter结果(我使用一个用ruby制作的twitter客户端)。我把它用于我个人的新闻目的。我已经用python实现了这个解决方案,但是!这并不是完全的命令行,我必须承认awk相对于python的优势。有时,对于一些可以使用awk的任务,oneliner在python代码中会使用10-15行代码。Ed,如果我采用我自己的解决方案,我将不得不系统地阅读很多关于awk的文章,并且现在有时间=金钱的压力*nix是广域的。Python代码中的
letitpass
变量看起来相当多余。只需
继续
循环,然后
打印
;触发
continue
的行将不会被打印。将筛选器文件转换为单个正则表达式可能会显著提高Python代码的运行时间。检查解决方案,是的,我使用echo“newstring”>>filter维护筛选器文件我不会使用当前解决方案获得输出。使用grep-Evif-words,words就是输入文件?修复了用
s/\\\\\\\$/
删除最后一个
——如果您的
sed
使用不同的语法,可以在debiany上的pipe.sed(GNU sed)4.2.2之前删除反斜杠。您的解决方案现在可以工作了,问题是输入文件中的尾随空格,即使没有添加s/\\\\\$//。Tnx,您可行的解决方案将是在所有线路上采用concernNo’Patren停留。看起来很有效率,稍后会检查,现在就放在那里,效果很好。在输入文件中,第5行的“this”是错误的,用其他字符串更正。现在,为了简单和优雅,你的答案引出了一个问题。所以有一点,为什么要用python写10行,而这个解决方案只有一行字。
tr '\n' '|' <filter |
sed 's/\|$//;s/.*/(^|[^[:alnum:]])(&)([^[:alnum:]]|$)/' |
grep -Evif - input
#!/usr/bin/env python3

import codecs, re

with codecs.open('filterfile', 'r', 'utf-8') as ffilter:
    lmyfilter = [line.strip('\n') for line in ffilter]

puncsp = r'[][\s!"&\'()*,-./:;?<>\_{}«·»‑–—―‖‘’“”…′$#]'
regex = re.compile(r'(?:^|' + puncsp + r')(' + '|'.join(lmyfilter) +
    r')(?:' + puncsp + r'|$)', re.IGNORECASE + re.LOCALE + re.UNICODE)

with codecs.open('inputfile', 'r', 'utf-8') as finput:
    for line in finput:
        line = line.strip('\n')
        if regex.search(line):
            continue
        print(line)
grep -vif filter input.txt