列出数字序列中缺失的最简洁的脚本是什么?

列出数字序列中缺失的最简洁的脚本是什么?

例如,我们有内容

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

我的方法是控制数字的大小,因为我将初始化两个变量:开始和结束限制并将开始限制附加到文件名,无限循环,比较开始结束限制,如果开始数字大于结束数字则退出,检查文件是否存在并增加起始限制。

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

如果这就是您需要的,我可以提供一些解释

相关内容