如何在shell脚本中比较两个文件?

时间:2009-10-09 12:13:15

标签: unix shell filecompare

这是我的情景。 我有两个文件有记录,每个记录的3-25个字符是一个标识符。基于此,我需要比较它们并使用新文件数据更新旧文件(如果它们的标识符匹配)。标识符以01开头。 请看下面的脚本。 这是一个错误,因为“第12行预期的论点是我无法理解的。

#!/bin/ksh
while read line
  do
    c=`echo $line|grep '^01' `
    if [ $c -ne NULL ];
      then
        var=`echo $line|cut -c 3-25`
    fi
    while read i
      do
        d=`echo $i|grep '^01' `
        if [ $d -ne NULL ];
          then
            var1=`echo $i|cut -c 3-25`
            if [ $var -eq $var1 ];
              then
                $line=$i
            fi
        fi
      done < test_monday
  done < test_sunday

请提前帮助我

3 个答案:

答案 0 :(得分:1)

我认为你需要的是:

if [ "$d" != NULL ];

尝试。

答案 1 :(得分:1)

除非您正在编写可移植到原始Bourne shell的脚本或其他不支持该功能的脚本,否则请在Bash和ksh you should use the [[ form of test中查找字符串和文件。

减少了引用和转义的需求,模式和正则表达式匹配等附加条件以及使用&&||代替-a和{{1}的能力}。

-o

此外,“NULL”在Bash和ksh中不是特殊值,因此您的测试将始终成功,因为if [[ $var == $var1 ]] 针对文字字符串“NULL”进行了测试。

$d

if [[ $d != "" ]]

对于数值(除非您使用八进制,否则不包括前导零),您可以使用数字表达式。您可以在此上下文中省略变量的美元符号。

if [[ $d ]]

没有必要将numval=41 if ((++numval >= 42)) # increment then test then echo "don't panic" fi echo用于子字符串。在Bash和ksh中你可以做到:

cut

注意:var=${line:3:23} 使用范围开头和结尾的字符位置,而此shell结构使用起始位置和字符数,因此您必须相应地调整数字。

get away from using backticks是个好主意。请改用cut。这可以嵌套,引用和转义可以减少或更容易。

答案 2 :(得分:0)

我认为你可以使用DIFF命令

diff file1 file2 > whats_the_diff.txt