我有一个带两个参数的脚本。
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。我该怎么做?此外,没有寻找替代方法来执行此操作,还有许多其他方法来检查目录之间的差异,但这是我的任务唯一可接受的方式:(
答案 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”行。
现在恰到好处。
测验:
$REPLY
?您如何更改脚本,以便将其称为:
$ 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"