Bashでは、
文字列内の非浮動小数点数の範囲を検索したい。
私がそのような文字列を持っている場合:
"1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg 4.5.jpg"
そして、firstNum-lastNumという数字が欠落しているかどうかを調べたいと思います。言う、もし
firstNum=1
lastNum=5
関数は
「1つが欠けている、2つが欠けている、5つが欠けている」
文字列内の非浮動小数点数を見つけるのは比較的簡単ですが、私のスクリプトを混乱させるのは、文字列の「2.005.jpg」部分です。私のスクリプトは、5がfloat 2の一部であることを認識する方法を理解していないため、無視する必要があります。
数字に先行ゼロがあるか、「[0-9]」があるかを言います。その前では、無視してください。しかし、残念ながら、先行ゼロをいくつでも含む数値のサポートが必要です。
の使用awk
に反対しない場合は、次のスクリプトを使用できます。
echo "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" | \
awk -v min=1 -v max=5 -v RS="[^0-9. ]+" '
($0+0)!~/\./&&/[0-9]+/{a[$0+0]}
END{for(i=min;i<=max;i++)if(!(i in a))print i " is missing"}'
これはGNUawkスクリプトであり、レコード区切り文字RS
を使用して(浮動小数点の)数値のみで行を分割します。
秘訣は、見つかった数値に0を追加し、それがまだ10進数形式(ドットなし.
)であることを確認することです。その場合、番号は配列に格納されa
ます。
このEND
ステートメントは、min
(1)からmax
(5)までのすべての10進数をループし、その数値が配列の一部でない場合はメッセージを出力しますa
。
posix準拠の代替スクリプトは次のとおりです。
echo "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" | \
awk -v min=1 -v max=5 '
{
split($0,n,"[^0-9. ]+");
for(i in n){
if((n[i]+0)!~/\./&&n[i]~/[0-9]+/){
a[n[i]+0]
}
}
}
END{for(i=min;i<=max;i++)if(!(i in a))print i " is missing"}'
主な違いは、split()
を置き換える関数の使用ですRS
。split
入力文字列を分割し、数値を配列に入れn
ます。次に、配列要素がチェックされ、a
10進数の場合は配列に入れられます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加