0

这是我的场景。我有两个文件,其中每个记录的 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

请帮助我提前谢谢

4

3 回答 3

1

我认为你需要的是:

if [ "$d" != NULL ];

尝试。

于 2009-10-09T12:18:31.543 回答
1

除非您正在编写可移植到原始 Bourne shell 或其他不支持该功能的脚本的脚本,否则在 Bash 和 ksh 中,您应该[[对字符串和文件使用测试形式。

减少了对引用和转义、模式和正则表达式匹配等附加条件以及使用&&and||代替-aand的能力的需求-o

if [[ $var == $var1 ]]

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

if [[ $d != "" ]]

或者

if [[ $d ]]

对于数值(不包括前导零,除非您使用八进制),您可以使用数值表达式。在这种情况下,您可以省略变量的美元符号。

numval=41
if ((++numval >= 42))  # increment then test
then
    echo "don't panic"
fi

没有必要对子字符串使用echocut。在 Bash 和 ksh 中,您可以执行以下操作:

var=${line:3:23}

注意:cut使用字符位置作为范围的开始和结束,而这个 shell 结构使用开始位置和字符数,因此您必须相应地调整数字。

避免使用反引号是个好主意。改为使用$()。这可以嵌套,并且引用和转义减少或更容易。

于 2009-10-09T13:40:59.163 回答
0

我认为您可以使用DIFF命令

diff file1 file2 > whats_the_diff.txt
于 2009-10-09T12:46:27.147 回答