在unix shell脚本中查找一个文件的内容到另一个文件中

我正在使用下面的shell脚本来查找另一个文件的内容:

#!/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文件中。 我有什么问题吗?

Solutions Collecting From Web of "在unix shell脚本中查找一个文件的内容到另一个文件中"

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 

你根本就不需要在这里回应; grep本身提供了这个功能。


现在使用你的文件名称:

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

您可以将','更改为文件中的分隔符。

另一个方案

  • 使用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 

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

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

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