0

これが私のシナリオです。各レコードの3〜25文字が識別子であるレコードを持つ2つのファイルがあります。これに基づいて、両方を比較し、識別子が一致する場合は古いファイルを新しいファイル データで更新する必要があります。識別子は 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 シェルまたは機能をサポートしていない他のシェルへの移植性のためにスクリプトを作成している場合を除き、Bash および ksh では、文字列およびファイルに対してtestの形式を使用する必要があります。[[

引用符やエスケープの必要性が減り、パターンや正規表現の一致などの条件が追加され、 and の代わりに and を使用できるよう&&||なり-aます-o

if [[ $var == $var1 ]]

また、「NULL」は Bash と ksh の特別な値ではないため$d、リテラル文字列「NULL」に対してテストされるため、テストは常に成功します。

if [[ $d != "" ]]

また

if [[ $d ]]

数値 (8 進数を使用している場合を除き、先行ゼロを含まない) については、数値式を使用できます。このコンテキストでは、変数のドル記号を省略できます。

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

echo部分文字列にはandを使用する必要はありませんcut。Bash と ksh では、次のことができます。

var=${line:3:23}

注:cut範囲の先頭と末尾に文字位置を使用しますが、このシェル構成では開始位置と文字数を使用するため、それに応じて数値を調整する必要があります。

また、 backticks を使用しないようにすることをお勧めします。$()代わりに使用してください。これは入れ子にすることができ、引用とエスケープが軽減または容易になります。

于 2009-10-09T13:40:59.163 に答える
0

DIFFコマンドを使用できると思います

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