嵌套for循环比较文件

时间:2012-07-03 11:47:28

标签: bash loops grep

我正在尝试编写一个bash脚本,该脚本查看两个具有相同名称的文件,每个文件位于不同的目录中。

我知道这可以用diff -r来完成,但是,我想把第二个文件中不包含在第一个文件中的所有内容输出到一个新文件中(也使用相同的文件名)

我用grep命令编写了一个(嵌套)循环,但它不好并且返回了语法错误:

#!/bin/bash
FILES=/Path/dir1/*
FILES2=/Path/dir2/*

for f in $FILES
do
for i in $FILES2
do 
if $f = $i
grep -vf $i $f > /Path/dir3/$i

done
done

任何帮助非常感谢。

3 个答案:

答案 0 :(得分:1)

试试这个

#!/bin/bash
cd /Path/dir1/
for f in *; do
    comm -13 <(sort $f) <(sort /Path/dir2/$f) > /Path/dir3/$f
done

如果shell中的语法是

if test_command;then commands;fi
如果test_command退出代码为0

,则执行

命令

if [ $f = $i ] ; then  grep ... ; fi

但在您的情况下,获取文件名

会更有效
for i in $FILES; do
    f=/Path/dir2/`basename $i`
    grep
done

最后,也许这比grep -v

更有效
comm -13 <(sort $f) <(sort $i)

comm -13将获得第二个而不是第一个的所有内容;没有参数的comm生成3列输出:第一列只有第一列,第二只是第二列,第三列是常见的。 -13或-1 -3删除第一列和第三列

答案 1 :(得分:0)

#!/bin/bash
DIR1=/Path/dir1
DIR2=/Path/dir2
DIR3=/Path/dir3

for f in $DIR1/*
do
  for i in $DIR2/*
  do 
    if [ "$(basename $f)" = "$(basename $i)" ]
    then
      grep -vf "$i" "$f" > "$DIR3/$(basename $i)"
    fi
  done
done

答案 2 :(得分:0)

这假设文件名中没有特殊字符。 (例如,空格。如果不可接受,请使用双引号。):

a=/path/dir1
b=/path/dir2
for i in $a/*; do test -e $b/${i##*/} && 
   diff $i $b/${i##*/} | sed -n '/^< /s///p'; done