一連の数字から欠落している内容を一覧表示する最も簡潔なスクリプトは何ですか? [コピー]

一連の数字から欠落している内容を一覧表示する最も簡潔なスクリプトは何ですか? [コピー]

たとえば、コンテンツがあります。

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

それが必要なら、私は説明することができます。

関連情報