![一連の数字から欠落している内容を一覧表示する最も簡潔なスクリプトは何ですか? [コピー]](https://linux33.com/image/85437/%E4%B8%80%E9%80%A3%E3%81%AE%E6%95%B0%E5%AD%97%E3%81%8B%E3%82%89%E6%AC%A0%E8%90%BD%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%86%85%E5%AE%B9%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%9C%80%E3%82%82%E7%B0%A1%E6%BD%94%E3%81%AA%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
たとえば、コンテンツがあります。
001
002
004
008
010
というテキストファイルからfile
欠落しているコンテンツをどのように抽出できますか3 5 6 7 9
?
答え1
一方awk
通行:
$ awk 'NR != $1 { for (i = prev + 1; i < $1; i++) {print i} } { prev = $1 + 1 }' file
3
5
6
7
9
より明確に言えば:
awk 'NR != $1 {
for (i = prev + 1; i < $1; i++) {
print i
}
}
{
prev = $1
}'
各行の行番号が数字と一致することを確認し、一致しない場合は、前のprev
数字()と現在の数字(含まれていないためi = prev + 1
)の間のすべての数字を印刷します。
答え2
私のアプローチは、開始と終了の制限などの2つの変数を初期化し、開始制限をファイル名に追加し、無限に繰り返し、開始と終了制限を比較し、開始番号がファイル名より大きい場合に終了するため、数値のサイズを制御しますです。終了番号を確認するには、ファイルAの開始制限が存在し、増加していることを確認してください。
StartNumber=$1
EndNumber=$2
while true; do
[ ${StartNumber} -gt ${EndNumber} ] && { exit 0 ; }
if [ ! -f ${FileName}_${StartNumber} ]; then
echo ${StartNumber}
fi
((StartNumber+=1))
done
あなたの意見に基づいたいくつかの提案は次のとおりです。
- findコマンドを実行し
find . -type f
て結果を繰り返してみてください。 - 各ファイルに対して上記のコマンドで生成されたアプリケーションは、数値を取得
echo ${filename} | tr -dc 0-9
するためにのみ使用されます。 - 「yyyyddd」を取得し、それを開始制限として使用し、終了制限として今日の日付と比較することができます。
答え3
サンプルファイルを使用すると仮定すると、次のコマンドが実行されます。
join -a 1 -o 1.1 2.1 -e missed <(seq -f '%03g' $(tail -1 <(sort file))) file | grep missed
この出力を生成します
003 missed 005 missed 006 missed 007 missed 009 missed
それが必要なら、私は説明することができます。