Linuxの16進シーケンスチェッカー?

Linuxの16進シーケンスチェッカー?

16進リストがあります。順番が合っているか確認したいです。つまり、昇順に連続した数字でなければなりません。つまり、各行から次の行までの増分は1でなければなりません。

16進リストの例:

85AF
85B0
85B1
85B2
85B3
85B4
85B5
85B6
85B7
85B8
85B9
85BA
85BB
85BC
85BD
85BE
85BF
85C0

実際に確認する必要がある数字が500を超えています。

希望の出力:

All numbers are in sequence
     (or)
Numbers are not in sequence.

これはkshを使用するSolarisでです。

答え1

出力が10進数の場合、awkはこれを簡単に実行できますが、16進数を解析することはできません(少なくとも標準awkはできず、GNU awkなどのいくつかのバージョンは可能です)。bc変換して使用してください。これはすべてのPOSIXシステムに適用されます。

{ echo "ibase=16"; cat input.txt; } | bc |
awk 'NR==1 {origin = $0-1}
     $0!=origin+NR {print "Out-of-sequence number at line", NR; exit(1)}' >&2

答え2

他の答えで述べたように、awkでこれを行うのは良いことですが、古代awk(おそらくSolarisで利用可能)は16進数を理解していません。

迅速な解決策はwc -lksh数学を使用することです。

#! /bin/ksh

first="0x$(head -n1 infile)"
last="0x$(tail -n1 infile)"
lines=$(wc -l <infile)

if [[ "$(( last - first + 1 - lines ))" -eq 0 ]]; then
    echo "All numbers are in sequence."
else
    echo "Numbers are not in sequence."
fi

答え3

以下は1つのオプションです。

while read x; do echo $((16#$x)); done <yourfile | awk 's && $1!=s+1{exit(1)}{s=$1}'

このシェルコマンドは、終了状態1(失敗時)と0(成功時)を生成します。このコマンドは、次のようにif句で使用して目的の出力を生成できます。

if  while read x; do echo $((16#$x)); done < yourfile | awk 's && $1!=s+1{exit(1)}{s=$1}'
then echo All numbers are in sequence
else echo Numbers are not in sequence
fi

(「yourfile」という名前を一連の16進数字を含むファイル名に変更する必要があります。)

シェルループを省略し、GNUawkオプションを使用して-n16進数を直接処理することもできます。

if  sed 's/^/0x/' <yourfile | awk -n 's && $1+0!=s+1{exit(1)}{s=$1+0}'
then echo All numbers are in sequence
else echo Numbers are not in sequence.
fi

注:sedは、構文的に予想される16進形式(先行を含む0x)を生成するために使用されます。

答え4

厳密なシーケンスが必要な場合は、エタロンシーケンスを作成し、それをファイルと比較することで簡単に実行できます。

[ $(comm --nocheck-order -3 \
     <(sed '/\S/!d' file) \
     <(printf "%X\n" \
          $(seq $((16#$(sed '/./!d;q' file))) \
                $((16#$(tac file|sed '/./!d;q')))))) ] &&
echo 'Numbers are not in sequence' ||
echo 'All numbers are in sequence'

すべての数字が16進数であることを確認するには、次の手順を実行します。

sed '/^[[:xdigit:] ]*$/!{
        s/.*/Numbers are not in sequence: &/
        q
                        }
     $! d
     s/.*/All numbers are in sequence/' hexadecimal_number.list
  • /^[[:xdigit:] ]*$/行に16進数記号とスペースのみがあることを確認してください(または空白行)。
  • !逆方向に一致するため、{}上記以外のシンボルが存在するたびにコマンドが実行されます。
  • s/.*/.../;q sNumbers are not in sequenceuit スクリプトのすべての行を印刷行に置き換えます。q
  • $! dスクリプトが前の行(パターン一致)を実行せず、その行が最後の行ではない場合は、次のd行から始めます。
  • s/.*/.../スクリプトが最後の行に達すると(すべての行がパターンと一致する)、印刷してs最後の行を置き換えます。All numbers are in sequence

関連情報