我使用下面的脚本找到一个文件的内容到另一个:
#!/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文件,以及。 这有什么错我在干嘛?
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}"
你可以改变','
你在你的文件有分隔符。
另一种解决方案:
- 使用
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
我不认为你真的需要一个脚本来执行你想要做什么。
一个命令就足够了。 在我的情况下,在需要的柱11的识别号码在csv文件(与“;”作为分隔符)
grep -f <(awk -F";" '{print $11}' FILE_TO_EXTRACT_PATTERNS_FROM.csv) TARGET_FILE.csv
我希望这有帮助。