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

NIM*_*NDE 10 unix linux shell awk grep

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

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

while read -r line; do
    grep $line /home/nimish/another_file.csv
done < "$file"
Run Code Online (Sandbox Code Playgroud)

我正在执行脚本,但它没有显示csv文件中的内容.我的contents.txt文件包含诸如csv文件中存在的数字"08915673""123223"其中的数字.我做错了吗?

Rub*_*ens 32

grep本身就能做到.只需使用标志-f:

grep -f <patterns> <file>
Run Code Online (Sandbox Code Playgroud)

<patterns>是一个文件,每行包含一个模式; 并且<file>是您要搜索内容的文件.

请注意,要强制grep将每一行视为一个模式,即使每行的内容看起来像正则表达式,也应该使用该标志-F, --fixed-strings.

grep -F -f <patterns> <file>
Run Code Online (Sandbox Code Playgroud)

如果您的文件是CSV,如您所说,您可以:

grep -f <(tr ',' '\n' < data.csv) <file>
Run Code Online (Sandbox Code Playgroud)

例如,考虑文件"a.txt",其中包含以下行:

alpha
0891234
beta
Run Code Online (Sandbox Code Playgroud)

现在,文件"b.txt",包含以下行:

Alpha
0808080
0891234
bEtA
Run Code Online (Sandbox Code Playgroud)

以下命令的输出是:

grep -f "a.txt" "b.txt"
0891234
Run Code Online (Sandbox Code Playgroud)

你根本不需要在for这里进行循环; grep本身就是这个功能.


现在使用您的文件名:

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

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