【问题标题】:Finding contents of one file in another file在另一个文件中查找一个文件的内容
【发布时间】:2013-02-10 03:37:40
【问题描述】:

我正在使用以下 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 文件中。我做的有什么问题吗?

【问题讨论】:

  • 考虑编辑您的问题以包含每个文件中的 2 行以及给定这些输入的预期输出。祝你好运。
  • 您上面的脚本没有使用file 变量,而是在那里记录名称。试试while read -r line &lt; $file; do。也就是说,ksh 很烂,我还没有检查它对-r 的作用,以知道它是否会起作用。此外,grep 将期望正则表达式并匹配包含您拥有的数字的任何值,即使 csv 文件中的行有其他前导或尾随数字:您可能需要 grep -w 或类似的。

标签: linux shell unix awk grep


【解决方案1】:

grep 本身可以这样做。只需使用标志-f

grep -f <patterns> <file>

&lt;patterns&gt; 是一个文件,每行包含一个模式; &lt;file&gt; 是您要在其中搜索内容的文件。

请注意,要强制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}"

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

【讨论】:

  • 所以使用 grep -f 会给出错误“.rep: 0652-033 Cannot open:”
  • 嗯,问题似乎出在文件路径上。你确定路径正确吗?尝试用双引号括起文件名。你是如何尝试执行的。请在下一条评论中添加您尝试运行的命令行。
  • 所以我只是通过 ./script.ksh 运行脚本
  • @NIMISHDESHPANDE 请尝试我发布的脚本。
  • 谢谢鲁本...我尝试了你提到的上述脚本,但它给了我错误“(不是预期的”
【解决方案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

【讨论】:

  • 末尾的“xx yy”是什么意思?
  • 这两个输入文件是你在另一个中搜索的
【解决方案3】:

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

一个命令就足够了。就我而言,我需要 CSV 文件的第 11 列中的标识号(以“;”作为分隔符):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2013-02-14
    相关资源
    最近更新 更多