逐行读取文件 - >搜索另一个文本文档中的每一行,如果匹配,则输出到另一个文本文件

时间:2011-03-12 19:14:31

标签: linux bash shell

我有一个带两个参数的脚本。

ls $1 > $1.txt
ls $2 > $2.txt  

我现在有a.txt($ 1是目录'a',$ 2是目录'b')和b.txt,每个内容都列在其中。我想要做的是在a.txt中逐行搜索,看看b.txt中是否有匹配。

如果我在a.txt中有这些文件:

file1 -> search for file1 in b.txt, if match, output to a_match.txt
file2 -> search for file2 in b.txt, if match, output to a_match.txt
file3 -> search for file3 in b.txt, if match, output to a_match.txt  

反之亦然b.txt。我该怎么做?此外,没有寻找替代方法来执行此操作,还有许多其他方法来检查目录之间的差异,但这是我的任务唯一可接受的方式:(

4 个答案:

答案 0 :(得分:2)

这是我认为符合您要求的快速解决方案:

fgrep -x -f b.txt a.txt > a_match.txt

答案 1 :(得分:0)

好的,这显然是功课,所以我不打算给你一个完整的解决方案。这是大纲

while "there are lines left in the file, read a line" do
     grep "the line" "the file"
done

获取行的关键是read命令。有关详细信息,请在bash中help read

<强>更新

好的,让我们看一下。使用

启动脚本

让我们调用脚本a.bash。你想把它作为

运行
 $ a.bash b.txt < a.txt > a_match.txt  

a.bash是一个从a.txt读取行的脚本,在b.txt中搜索并将输出发送到STDOUT,然后将其导入到文件a_match.txt。

用“shebang line”启动脚本。通常是

 #!/usr/bin/bash --

或类似的东西。

read原语只是将一行读入变量,默认情况下会读入名为REPLY的变量。所以“文件中还有行,读一行”只是

 while read

要搜索的文件的名称将在特殊的shell变量$ 1中,表示第一个参数。由于其他名称在重定向中使用,因此它们根本不作为参数出现。

现在,命令 grep(1)在文件中搜索字符串,并将字符串出现的行放到STDOUT上。所以我们所需要的只是搜索

 grep $REPLY b.txt

(阅读grep的手册页。)

由于 grep(1)无论如何都会将输出放在STDOUT上,它会被输出并重定向到a_matches.txt。那是你的“grep the line in the file”行。

现在恰到好处。

测验:

  1. 为什么是$REPLY
  2. 您如何更改脚本,以便将其称为:

    $ a.bash a.txt b.txt a_matches.txt

答案 2 :(得分:0)

这可以帮助您完成本教程,并且它可以满足您的要求。而且,不仅有一种方法可以逐行读取文件,有些方法比其他方式更快,有些方法比其他方式更直观。

http://www.unix.com/tips-tutorials/18009-12-ways-parse-file.html

答案 3 :(得分:-1)

这就是我要用的:

diff dir1/ dir2/

diff "$1" "$2"