找到一个文件的内容在另一个文件(Finding contents of one file in an

2019-07-20 10:58发布

我使用下面的脚本找到一个文件的内容到另一个:

#!/bin/ksh
file="/home/nimish/contents.txt"

while read -r line; do
    grep $line /home/nimish/another_file.csv
done < "$file"

我执行脚本,但它没有显示从CSV文件中的内容。 我的contents.txt文件包含数字,如"08915673""123223" ,其存在于csv文件,以及。 这有什么错我在干嘛?

Answer 1:

grep本身是能够做到这一点。 使用时只需将标志-f

grep -f <patterns> <file>

<patterns>是包含在每行一个图案的文件; 和<file>是要在其中进行搜索的东西文件。

需要注意的是,强制grep考虑每行的模式,即使每个行的内容看起来像一个正则表达式,你应该使用标志-F, --fixed-strings

grep -F -f <patterns> <file>

如果你的文件是一个CSV,如你所说,你可以这样做:

grep -f <(tr ',' '\n' < data.csv) <file>

作为一个例子,考虑文件“a.txt中”,用下面几行:

alpha
0891234
beta

现在,文件“b.txt”,用线:

Alpha
0808080
0891234
bEtA

下面的命令的输出是:

grep -f "a.txt" "b.txt"
0891234

你并不需要在所有for -loop这里; grep本身提供此功能。


现在使用的文件名:

#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"

你可以改变','你在你的文件有分隔符。



Answer 2:

另一种解决方案:

  • 使用awk ,创建自己的hash (例如ahash),自己所有的控制。
  • 更换$0 to $i ,你可以匹配任何你想要的领域。

awk -F"," '
{  
   if (nowfile==""){ nowfile = FILENAME;  }

   if(FILENAME == nowfile)
   {
     hash[$0]=$0;
   }
   else
   {
       if($0 ~ hash[$0])
       {  
           print $0
       }
   }
} '  xx yy


Answer 3:

我不认为你真的需要一个脚本来执行你想要做什么。

一个命令就足够了。 在我的情况下,在需要的柱11的识别号码在csv文件(与“;”作为分隔符)

grep -f <(awk -F";" '{print $11}' FILE_TO_EXTRACT_PATTERNS_FROM.csv) TARGET_FILE.csv 

我希望这有帮助。



文章来源: Finding contents of one file in another file