天道酬勤,学无止境

Search Multiple Strings (from File) in a file and print the line

Again apologies for been noob here: Trying below code for searching multiple strings read from keywords and search in f and printing the line. It works if I have only one keyword but not if I have more then one.

keywords = input("Please Enter keywords path as c:/example/ \n :")
keys = open((keywords), "r").readline()
with open("c:/saad/saad.txt") as f:
    for line in f:
        if (keys) in line:
            print(line)

评论

One of the challenges of looking for keywords is defining what you mean by keyword and how a file's contents should be parsed to find the full set of keywords. If "aa" is a keyword, should it match "aaa" or maybe ""aa()"? Can a keyword have numbers in it?

A simple solution is to say that keywords are alphabetic only and should match contiguous alphabetic strings exactly, ignoring case. Further, matches should be considered line by line, not sentence by sentence. We can use a regex to find alphabetic sequences and sets to check containment like so:

keys.txt

aa bb 

test.txt

aa is good
AA is good
bb is good
cc is not good
aaa is not good

test.py

import re

keyfile = "keys.txt"
testfile = "test.txt"

keys = set(key.lower() for key in 
    re.findall(r'\w+', open(keyfile , "r").readline()))

with open(testfile) as f:
    for line in f:
        words = set(word.lower() for word in re.findall(r'\w+', line))
        if keys & words:
            print(line, end='')

Result:

aa is good
AA is good
bb is good

Add more rules for what you mean by a match and it gets more complicated.

EDIT

Suppose you have one keyword per line and you just want a substring match (that is, "aa" matches "aaa") instead of a keyword search, you could do

keyfile = "keys.txt"
testfile = "test.txt"

keys = [key for key in (line.strip() for line in open(keyfile)) if key]

with open(testfile) as f:
    for line in f:
        for key in keys:
            if key in line:
                print(line, end='')
                break

But I'm just guessing what your criteria are.

keywords = input("Please Enter keywords path as c:/example/ \n :")
keys = open((keywords), "r").readline()
keys = keys.split(',')  # separates key strings
with open("c:/saad/saad.txt") as f:
    for line in f:
        for key in keys:
            if key.strip() in line:
                print(line)

You are reading the line in as one string. You need to make a list of each comma separated string. Then test each key for each line (removing whitespace around the key)

This is assuming your keyword file is something like: aa is good, bb is good, spam, eggs

#The Easiest one...
def strsearch():

  fopen = open('logfile.txt',mode='r+')

  fread = fopen.readlines()

  x = 'Product Name'

  y = 'Problem Description'

  z = 'Resolution Summary'

  for line in fread:

      #print(line)

       if x in line:

           print(line)

       if y in line:

           print(line)

       if z in line:

           print(line)

strsearch()

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • grep 用于文件中不同行的多个字符串(即整个文件,而不是基于行的搜索)?(grep for multiple strings in file on different lines (ie. whole file, not line based search)?)
    问题 我想在任何一行上 grep 包含单词Dansk 、 Svenska或Norsk文件,并带有一个可用的返回码(因为我真的只喜欢包含字符串的信息,我的单行代码比这更进一步)。 我有很多文件,里面有这样的行: Disc Title: unknown Title: 01, Length: 01:33:37.000 Chapters: 33, Cells: 31, Audio streams: 04, Subpictures: 20 Subtitle: 01, Language: ar - Arabic, Content: Undefined, Stream id: 0x20, Subtitle: 02, Language: bg - Bulgarian, Content: Undefined, Stream id: 0x21, Subtitle: 03, Language: cs - Czech, Content: Undefined, Stream id: 0x22, Subtitle: 04, Language: da - Dansk, Content: Undefined, Stream id: 0x23, Subtitle: 05, Language: de - Deutsch, Content: Undefined, Stream id: 0x24, (...)
  • 检查文件中是否存在所有多个字符串或正则表达式(Check if all of multiple strings or regexes exist in a file)
    问题 我想检查我的所有字符串是否都存在于文本文件中。 它们可以存在于同一行或不同行。 并且部分匹配应该可以。 像这样: ... string1 ... string2 ... string3 ... string1 string2 ... string1 string2 string3 ... string3 string1 string2 ... string2 string3 ... and so on 在上面的示例中,我们可以用正则表达式代替字符串。 例如,以下代码检查文件中是否存在我的任何字符串: if grep -EFq "string1|string2|string3" file; then # there is at least one match fi 如何检查它们是否全部存在? 因为我们只是对所有匹配项的存在感兴趣,所以我们应该在所有字符串都匹配后立即停止读取文件。 是否可以不必多次调用grep (在输入文件很大时,或者如果我们有大量匹配的字符串时就不会缩放)或使用awk或python类的工具来执行此操作? 另外,是否有可以轻松扩展为正则表达式的字符串的解决方案? 回答1 Awk是发明grep,shell等的人发明的工具,可以执行这种通用的文本处理工作,因此不确定为什么要避免使用它。 如果简洁是您想要的,以下是GNU awk的一线内容,可满足您的要求: awk
  • 使用 DOS 批处理文件从文件中删除某些内容(To remove some content from a file using DOS batch file)
    问题 我有一个文件“Text.dat”,其中包含一些不需要的数据。 我需要编写一个 DOS 批处理文件来删除不需要的数据并将其放入其他文件中,例如“file2.dat”,并将原始文件与所需数据单独保留。 请帮忙 回答1 我会使用findstr而不是find ,它是一个更强大的find 。 要创建仅包含不需要的数据的文件: findstr "unwanted" text.dat > unwanted.dat 要从 text.dat 创建一个删除“不需要的”数据的新文件: findstr /v "unwanted" text.dat > text_cleaned.dat 可以在此处找到在线findstr参考。 完整的命令行参考: C:\>findstr /? Searches for strings in files. FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] strings [[drive:][path]filename[ ...]] /B Matches pattern if at the beginning of a line
  • 在非常大的文件中快速搜索字符串(Fast string search in a very large file)
    问题 在包含字符串的文件中搜索行的最快方法是什么。 我有一个包含要搜索的字符串的文件。 这个小文件 (smallF) 包含大约 50,000 行,如下所示: 字符串搜索1 字符串搜索2 字符串搜索3 我必须在一个更大的文件(大约1 亿行)中搜索所有这些字符串。 如果此较大文件中的任何行包含搜索字符串,则打印该行。 到目前为止我想出的最好的方法是 grep -F -f smallF largeF 但这不是很快。 smallF 中只有 100 个搜索字符串,大约需要 4 分钟。 对于超过 50,000 个搜索字符串,将花费大量时间。 有没有更有效的方法? 回答1 我曾经注意到使用-E或多个-e参数比使用-f更快。 请注意,这可能不适用于您的问题,因为您要在更大的文件中搜索 50,000 个字符串。 但是,我想向您展示可以做什么以及哪些可能值得测试: 以下是我详细注意到的: 有 1.2GB 文件填充随机字符串。 >ls -has | grep string 1,2G strings.txt >head strings.txt Mfzd0sf7RA664UVrBHK44cSQpLRKT6J0 Uk218A8GKRdAVOZLIykVc0b2RH1ayfAy BmuCCPJaQGhFTIutGpVG86tlanW8c9Pa etrulbGONKT3pact1SHg2ipcCr7TZ9jc
  • 如何在Linux命令行中替换多个文件中的字符串(How to replace a string in multiple files in linux command line)
    问题 我需要用仅ssh访问服务器来替换文件夹中许多文件中的字符串。 我怎样才能做到这一点? 回答1 cd /path/to/your/folder sed -i 's/foo/bar/g' * 出现的“ foo”将被替换为“ bar”。 在macOS之类的BSD系统上,您需要按手册页提供-i '.bak'类的备份扩展名,否则需要提供“风险损坏或部分内容”。 cd /path/to/your/folder sed -i '.bak' 's/foo/bar/g' * 回答2 与Kaspar的答案类似,但带有g标志来替换一行中的所有匹配项。 find ./ -type f -exec sed -i 's/string1/string2/g' {} \; 对于不区分大小写的全局变量: find ./ -type f -exec sed -i 's/string1/string2/gI' {} \; 回答3 @kev的答案很好,但只影响即时目录中的文件。下面的示例使用grep递归查找文件。 每次都对我有用。 grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @ 命令细目 grep的-r:--recursive递归地读每一目录下的所有文件。 grep -l : -- print -with-matches
  • 用grep在一行中匹配两个字符串(Match two strings in one line with grep)
    问题 我正在尝试使用grep来匹配包含两个不同字符串的行。 我尝试了以下内容,但是这匹配包含string1或string2的行,而不是我想要的行。 grep 'string1\|string2' filename 那么,如何只将包含两个字符串的行与grep匹配? 回答1 您可以使用 grep 'string1' filename | grep 'string2' 或者 grep 'string1.*string2\|string2.*string1' filename 回答2 我认为这是您想要的: grep -E "string1|string2" filename 我认为这样的答案: grep 'string1.*string2\|string2.*string1' filename 仅与同时存在两者而不是其中一个或两者都存在的情况匹配。 回答3 要在任何位置搜索包含所有单词的文件,顺序不限: grep -ril \'action\' | xargs grep -il \'model\' | xargs grep -il \'view_type\' 第一个grep开始进行递归搜索( r ),忽略大小写( i )并列出(打印出)与( l )匹配的一个词的文件名(单引号的'action' )出现在文件的任何位置。文件。 后续的搜索将搜索其他术语,从而保持不区分大小写并列出匹配的文件。
  • 在文本文件 C 中搜索字符串(Search for string in text file C)
    问题 以下代码一次读取一个文本文件一个字符并将其打印到标准输出: #include <stdio.h> int main() { char file_to_open[] = "text_file.txt", ch; FILE *file_ptr; if((file_ptr = fopen(file_to_open, "r")) != NULL) { while((ch = fgetc(file_ptr)) != EOF) { putchar(ch); } } else { printf("Could not open %s\n", file_to_open); return 1; } return(0); } 但不是打印到标准输出 [putchar(ch)] 我想在文件中搜索另一个文本文件中提供的特定字符串,即。 strings.txt 并将匹配的行输出到 out.txt text_file.txt : 1993 - 1999 Pentium 1997 - 1999 Pentium II 1999 - 2003 Pentium III 1998 - 2009 Xeon 2006 - 2009 Intel Core 2 strings.txt : Nehalem AMD Athlon Pentium 在这种情况下, text_file.txt行将匹配。 我对 C
  • 优化Shell脚本以进行多个sed替换(Optimize shell script for multiple sed replacements)
    问题 我有一个文件,其中包含替换对(大约100个)的列表,这些替换对由sed用来替换文件中的字符串。 这对像: old|new tobereplaced|replacement (stuffiwant).*(too)|\1\2 我当前的代码是: cat replacement_list | while read i do old=$(echo "$i" | awk -F'|' '{print $1}') #due to the need for extended regex new=$(echo "$i" | awk -F'|' '{print $2}') sed -r "s/`echo "$old"`/`echo "$new"`/g" -i file done 我不禁认为,有一种执行替换的最佳方法。 我尝试过将循环首先运行到文件的每一行,但事实证明这要昂贵得多。 还有其他加快此脚本速度的方法吗? 编辑 感谢您的所有快速回复。 让我在选择答案之前尝试各种建议。 需要清除的一件事:我还需要子表达式/组功能。 例如,我可能需要的替代品是: ([0-9])U|\10 #the extra brackets and escapes were required for my original code 有关改进的一些细节(有待更新): 方法:处理时间原始脚本:0.85秒 cut而不是awk
  • 使用多个 sed 命令(Using multiple sed commands)
    问题 嗨,我正在搜索文件并输出与以下正则表达式匹配并删除匹配文本的行的值,我不需要将其输出到文件。 这是我目前正在使用的,它输出所需的文本但多次: #!/bin/sh for file in *; do sed -e 's/^owner //g;p;!d ; s/^admin //g;p;!d ; s/^loc //g;p;!d ; s/^ser //g;p;!d' $file done 首选格式是这样的,所以我可以控制中间发生的事情: for file in *; do sed 's/^owner //g;p' $file | head -1 sed 's/^admin //g;p' $file | head -1 sed '/^loc //g;p' $file | head -1 sed '/^ser //g;p' $file | head -1 done 示例输入文件如下: owner sys group admin guy loc Q-30934 ser 18r9723 comment noisy fan is something 所需的输出如下: sys group guy Q-30934 18r9723 回答1 您多次向sed p (用于打印)命令。 它每次打印整行。 除非你用-n选项告诉它不要,否则sed无论如何都会在最后打印该行。 您还多次发出!d命令。 在添加多个
  • Perl:在多个文本文件中查找和替换特定字符串(Perl: Find and replace specific string in multiple text file)
    问题 我需要获取给定目录中的所有 .config 文件,在这些文件中的每一个中,我需要搜索特定字符串并根据文件替换为另一个。 例如,如果我在给定目录中有 3 个文件: for my_foo.config - string to search "fooCommon >" replace with "~ /fooCommon[\/ >" for my_bar.config - string to search "barCommon >" replace with "~ /barCommon[\/ >" for my_file.config - string to search "someCommon >" replace with "~ /someCommon[\/ >" 请让我知道如何在 Perl 中做到这一点? 下面是我在 shell 脚本中尝试的代码: OLD="\/fooCommon >" NEW="~ \"\/fooCommon[^\/]*\" >" DPATH="/myhome/aru/conf/host*.conf" BPATH="/myhome/aru/conf/bakup" TFILE="/myhome/aru/out.tmp.$$" [ ! -d $BPATH ] && mkdir -p $BPATH || : for f in $DPATH do if [ -f
  • 根据模式将一个文件拆分为多个文件(剪切可能会在行中发生)(Split one file into multiple files based on pattern (cut can occur within lines))
    问题 存在许多解决方案,但是这里的特殊性是我需要能够在一行内拆分,剪切应该在模式之前进行。 前任: 档案内: <?xml 1><blabla1> <blabla><blabla2><blabla> <blabla><blabla> <blabla><blabla3><blabla><blabla> <blabla><blabla><blabla><?xml 4> <blabla> <blabla><blabla><blabla> <blabla><?xml 2><blabla><blabla> 应该变成模式<?xml Outfile1: <?xml 1><blabla1> <blabla><blabla2><blabla> <blabla><blabla> <blabla><blabla3><blabla><blabla> <blabla><blabla><blabla> Outfile2: <?xml 4> <blabla> <blabla><blabla><blabla> <blabla> Outfile3: <?xml 2><blabla><blabla> 实际上,经过验证的答案中的perl脚本适用于我的小示例。 但这会为我的较大文件(约6GB)生成错误。 错误是: panic: sv_setpvn called with negative strlen at /home/
  • Perl 一次性查找并替换多个(巨大的)字符串(Perl find and replace multiple(huge) strings in one shot)
    问题 基于映射文件,我需要搜索一个字符串,如果找到,则将替换字符串附加到行尾。 我正在逐行遍历映射文件并使用下面的 perl one-liner,附加字符串。 问题: 1.巨大的查找和替换条目:但问题是映射文件有大量条目(约 7000 个条目),perl one-liners 每个条目需要约 1 秒,归结为约 1 小时才能完成整个替换。 2.不是简单的查找和替换:它不是简单的查找和替换。 它是 - 如果找到字符串,将替换字符串附加到 EOL。 如果没有有效的方法来处理这个,我什至会考虑替换而不是附加。 我的是在 Windows 7 64 位环境中,我使用的是 active perl。 没有 *unix 支持。 文件样本 地图.csv findStr1,RplStr1 findStr2,RplStr2 findStr3,RplStr3 ..... findStr7000,RplStr7000 输入文件 col1,col2,col3,findStr1,....col-N col1,col2,col3,findStr2,....col-N col1,col2,col3,FIND-STR-NOT-EXIST,....col-N output.csv (预期输出) col1,col2,col3,findStr1,....col-N,**RplStr1** col1,col2,col3
  • Perl 中的快速多重搜索和替换(Fast multiple search and replace in Perl)
    问题 我有一个文件: map.txt - 它有 1000 多行,如下格式: aaa { 123 }; bbb { 4567 }; cc { 89 }; 我有另一个文件input.txt有 500 万行以上; 其中包含 aaa 为"aaa" , bbb 为"bbb"格式。 我可以得到一个关于在 perl 中搜索和替换所有出现的最快方法的建议: "aaa"与"123" "bbb"与"4567"等。 回答1 使用哈希。 使用旧字符串作为键,替换字符串作为值。 #!/usr/bin/perl use warnings; use strict; my %map; open my $MAP, '<', 'map.txt' or die $!; while (<$MAP>) { my ($pattern, $replacement) = /(.*) { (.*) };/; $map{$pattern} = $replacement; } open my $IN, '<', 'input.txt' or die $!; while (<$IN>) { s/"(.*)"/"$map{$1}"/g; print; } 要输出到新文件,请按如下方式更改最后一段: open my $IN, '<', 'input.txt' or die $!; open my $OUT, '>', 'output.txt
  • 在子目录中移动多个文件(和/或通过多字符分隔符拆分字符串)[bash](Moving multiple files in subdirectories (and/or splitting strings by multichar delimeter) [bash])
    问题 所以基本上,我有一个文件夹,里面有一堆子文件夹,里面有 100 多个文件。 我想获取所有 mp3 文件(非常通用的扩展名,因为我必须使用 jpg 等来执行此操作)并将它们移动到原始目录中的新文件夹中。 所以基本上文件结构如下所示: /.../dir/recup1/file1.mp3 /.../dir/recup2/file2.mp3 ... 等等。 我希望它看起来像这样: /.../dir/music/file1.mp3 /.../dir/music/file2.mp3 ... 等等。 我想我会使用一个看起来像这些行的 bash 脚本: #!/bin/bash STR=`find ./ -type f -name \*.mp3` FILES=(echo $STR | tr ".mp3 " "\n") for x in $FILES do echo "> [$x]" done 我现在只是让它回显,但最终我想使用mv将它放到正确的文件夹中。 显然这不起作用,因为 tr 将每个字符视为分隔符,所以如果你们有更好的主意,我会很感激。 (仅供参考,我正在运行上网本 Ubuntu,所以如果有类似于 Windows 搜索的 GUI 方式,我不会反对使用它) 回答1 如果music文件夹存在,那么以下应该可以工作 - find /path/to/search -type f -iname "
  • Perl 从目录中的文件中替换字符串(Perl replacing Strings from files in directory)
    问题 我正在尝试制作一个程序来替换目录中所有文件中的字符串。 问题是,我只需要在句子的开头或结尾或两者兼而有之时才可以更改它。 这是我到目前为止: use strict; use warnings; use File::Find; #This lets us use the find() function, similar to 'find' in Unix # -- which is especially helpful for searching recursively. print "Which directory do you want to use?\n"; #Ask what directory to use my $dir = readline STDIN; chomp $dir; #Used for eliminating the newline character '\n' print "What String would you like to search for?\n"; #Ask for what String to search for. my $search = readline STDIN; chomp $search; print "What String would you like to replace it with?\n"; #Ask
  • Python:从另一个文本文件中搜索一个文件中列出的字符串?(Python: search for strings listed in one file from another text file?)
    问题 我想在另一个文本文件中找到list.txt(每行一个字符串)中列出的字符串,以防万一找不到“ string,other_sentence”时打印“ string,one_sentence”。 我正在使用以下代码,但它仅在文件list.txt的字符串列表中找到最后一个字符串。 无法理解可能是什么原因? data = open('c:/tmp/textfile.TXT').read() for x in open('c:/tmp/list.txt').readlines(): if x in data: print(x,',one_sentence') else: print(x,',another_sentence') 回答1 当您使用readlines()读取文件时,生成的列表元素确实具有尾随换行符。 可能是这些原因导致您的匹配项少于预期的原因。 而不是写 for x in list: 写 for x in (s.strip() for s in list): 这将从list的字符串中删除前导和尾随空格。 因此,它从字符串中删除结尾的换行符。 为了合并您的程序,您可以执行以下操作: with open('c:/tmp/textfile.TXT') as f: haystack = f.read() if not haystack: sys.exit("Could not
  • Perl replacing Strings from files in directory
    I'm trying to make a program that replaces a string in all files in a directory. The catch is that I need to make it possible to only change it if it is at the beginning of a sentence or at the end, or both. This is what I have so far: use strict; use warnings; use File::Find; #This lets us use the find() function, similar to 'find' in Unix # -- which is especially helpful for searching recursively. print "Which directory do you want to use?\n"; #Ask what directory to use my $dir = readline STDIN; chomp $dir; #Used for eliminating the newline character '\n' print "What String would you like to
  • 大 (27GB) 文件的更快 grep 功能(Faster grep function for big (27GB) files)
    问题 我必须从包含特定字符串的文件 (5MB) 中 grep 与来自大文件 (27GB) 的相同字符串(和其他信息)。 为了加快分析速度,我将 27GB 文件拆分为 1GB 文件,然后应用以下脚本(在某些人的帮助下)。 但是它的效率不是很高(生成一个 180KB 的文件需要 30 个小时!)。 这是脚本。 有没有比 grep 更合适的工具? 或者更有效的使用 grep 的方法? #!/bin/bash NR_CPUS=4 count=0 for z in `echo {a..z}` ; do for x in `echo {a..z}` ; do for y in `echo {a..z}` ; do for ids in $(cat input.sam|awk '{print $1}'); do grep $ids sample_"$z""$x""$y"|awk '{print $1" "$10" "$11}' >> output.txt & let count+=1 [[ $((count%NR_CPUS)) -eq 0 ]] && wait done done #& 回答1 您可以尝试以下几点: 1) 您正在多次阅读input.sam 。 它只需要在您的第一个循环开始之前读取一次。 将 id 保存到一个临时文件中,该文件将由grep读取。 2) 在 grep 命令前加上LC
  • Linux中Grep命令(在文本中搜索指定文本)
    Grep(Global regular expression print,全局正则表达式输出)的缩写,他是Linux中最强的的命令之一。grep在一个或多个输入文本中搜索与给定模式匹配的行。并将每条匹配的行写入标准的输出。如果未至定文件,则grep将从标准输入读取,输入通常是另一个命令的输出。 一、grep命令语法: grep [OPTIONS] PATTERN [file....] 方括号中的项目是可选的: OPTIONS-零个或多个选项,Grep包含许多控制其行为的选项。 PATTERN-搜索模式 FILE-零个或多个输入文件名 为了能够搜索文件,运行命令的用户必须对文件具有可读权限。 二、grep最基本的用法是在文件中搜索字符串(文本) 1、要显示/etc/passwd文件中包含字符串bash的所有行,请运行一下命令: grep bash /etc/passwd # 查询passwd中有多少行包含bash 2、如果字符串中包含空格,则需要将其用单引号或者双引号引起来。 grep "Gnome Display Manager" /etc/passwd #字符串包含字符需要用单引号或者双引号引起来 3、反转匹配(排除),要显示与模式不匹配的行,用 -V(--invert-match)选项 grep -V nologin /etc/passwd # 打印不包含nologin的行 4
  • Grep 在目录中的所有文件中搜索 string1 和 string2(Grep Search all files in directory for string1 AND string2)
    问题 如何在 cygwin 中使用 grep 查找包含两个单词的所有文件。 这是我用来递归搜索目录中所有文件的一个词: grep -r "db-connect.php" . 如何扩展上述内容以查找同时包含“db-connect.php”和“version”的文件。 我试过这个: grep -r "db-connect.php\|version" . 但这是一个 OR,即它获取包含一个或另一个的文件。 感谢大家的帮助 回答1 grep -r db-connect.php . | grep version 回答2 如果要对文件中具有不同行的多个字符串进行 grep,请使用以下命令: grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3 这将为您提供包含 expr1、expr2 和 expr3 的文件列表。 请注意,如果目录中的任何文件名包含空格,这些文件将产生错误。 这可以通过将 -0 添加到 grep 和 xargs 来解决。 回答3 grep "db-connect.php" * | 剪切 -d: -f1 | xargs grep“版本” 我没有在递归模式下尝试过,但应该是一样的。 回答4 为了and一起多次搜索,使用多个向前断言,看了除了最后一个每一个东西: 而不是写作 grep -P A * | grep B 你写