【问题标题】:Find missing numbers in file查找文件中缺失的数字
【发布时间】:2020-07-28 20:34:55
【问题描述】:

我有一个数据文件,其中包含一堆乱序数字,每行一个。我想看看我遗漏了哪些数字(如果有)。

示例数据:

1
2
2
3
4
2
6
7
8
3

最佳尝试:

cat myfile | sort -n -u | awk 'NR!=$0'
# output:
6
7
8

这有点工作。它打印出行号与该行内容不匹配的所有数字,这至少告诉我我错过了 5,但只能在之后打印所有数字。

在 awk/sed/bash/sort/etc 中有没有好的方法可以做到这一点,还是我必须拔出 python?

我还想查找文件中的重复项及其数量,但cat file | sort -n | uniq -c -d 似乎非常适合。

【问题讨论】:

  • 使用每个值作为 awk 数组中的键。还将最大值放入变量中。最后从1循环到最高,检查每个值是否在数组中。
  • @anubhava,在这种情况下,是的。不过,我认为我的答案适用于任何起始数字。

标签: bash awk sed


【解决方案1】:

awk:

awk '{a[$0]++; if ($0 > max) max=$0} 
    END { for (i=1; i < max; i++) if(!(i in a)) print i }' < myfile

a 是一个关联数组,它使用文件中的每个数字作为键。 max 包含文件中的最大数字。

最后,我们只检查从 1 到 max 的每个数字,看看它是否在数组中。

【讨论】:

  • 这看起来也是个好方法!你能检查我的方法是否也有效吗?如果你有时间,我很想对我的尝试提供反馈。
  • 好吧,我想我明白你的代码做了什么(我花了一分钟才意识到你正在增加存储在$0 键下的值)。很好,它还可以提供有关重复项的信息。谢谢你给我看!
【解决方案2】:

使用来自GNU coreutilsbashsortsequniq 实用程序,并假设文件numbers.txt 中的每一行都是一个正整数,这个两行程序在“差距”。

nums=$(sort -nu numbers.txt)
{ seq ${nums##*$'\n'}; echo "$nums"; } | sort -n | uniq -u

【讨论】:

    【解决方案3】:

    好吧,我想我明白了(不过如果我搞砸了,请随时告诉我)

    cat file | sort -n -u | \
    awk 'BEGIN{range=0};{
         if(++range!=$1){
          for (i=range; i<$1; i++)
            {print i}
          range=$1
          }
        }'
    
    

    它增加一个以行号开始的计数器,检查该行的值是否等于该值。如果相等,则递增并继续。

    如果不是,则遍历预期和实际之间的所有数字,并相应地增加预期

    它似乎有效!

    【讨论】:

    • 您的方法与您的原始代码基本相同,因为rangeNR 相同
    • 我的原始代码会在一次未命中后打印出每个数字,但我认为不会这样,因为如果我们进入 if 语句,则第二次递增。
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多