【问题标题】:How to compare two files in shell script?如何比较shell脚本中的两个文件?
【发布时间】:2009-10-09 12:13:14
【问题描述】:

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

请帮帮我提前谢谢

【问题讨论】:

  • @ALN,您能否也发布一些示例数据,以便更容易理解需求。谢谢
  • 如果您发布一些示例数据,您不仅可以通过 awk、sed、perl 等获得 shell 脚本解决方案,还可以获得比 shell 脚本更简单的解决方案。
  • 第一个文件是这样的 011111111111111111111+ 012554565645645455555+ .... ... ... 第二个文件是 011111111111111111111111+ 015456565635数据> .... ...所以我将两个文件从 1-25 个字符(最多 + sybol)作为键进行比较,如果第二个文件匹配记录 ..我必须在第一个文件中替换它...或者只是将其附加到第一个文件.........

标签: unix shell filecompare


【解决方案1】:

我认为你需要的是:

if [ "$d" != NULL ];

试试吧。

【讨论】:

  • 这有助于消除第一个错误...谢谢....但是在比较两个指标时还有一个类似的错误...在 if [ $var == $var1 ];需要帮助........
  • 你确定 if 语句中的“间距”了吗?
  • 在 bash 中比较字符串的关键是你应该在它周围加上引号,除非你非常确定它永远不会有空间。因为 Bash 会将该变量的值替换为“if”的参数,并且参数用空格分隔(因此,如果值包含空格,则会得到多个变量)。所以首先,用引号括起来。接下来是,在比较字符串时使用“==”和“!=”。 :D
【解决方案2】:

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

减少了对引用和转义、模式和正则表达式匹配等附加条件的需求,以及使用&amp;&amp;|| 而不是-a-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 构造使用开始位置和字符计数,因此您必须相应地调整数字。

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

【讨论】:

    【解决方案3】:

    我认为你可以使用DIFF 命令

    diff file1 file2 > whats_the_diff.txt
    

    【讨论】:

    • 那不是我需要的。我只需要比较数据库中的标识符和更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2011-02-15
    • 2010-12-08
    • 2022-10-18
    相关资源
    最近更新 更多