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 -l
ksh数学を使用することです。
#! /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
オプションを使用して-n
16進数を直接処理することもできます。
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
s
Numbers are not in sequence
uit スクリプトのすべての行を印刷行に置き換えます。q
$! d
スクリプトが前の行(パターン一致)を実行せず、その行が最後の行ではない場合は、次のd
行から始めます。s/.*/.../
スクリプトが最後の行に達すると(すべての行がパターンと一致する)、印刷してs
最後の行を置き換えます。All numbers are in sequence