找出序号中的差距

Sha*_*aun 32 bash awk

如果这是一个简单的问题(或者比我想的更复杂),我不会这样做是为了生活,请原谅我.我一直在挖掘档案,发现很多技巧很接近,但是作为一个新手,我不知道如何调整我的需求,或者他们超出了我的理解.

我有一些大数据文件,我可以解析出来生成一个主要是顺序的坐标列表

5
6
7
8
15
16
17
25
26
27
Run Code Online (Sandbox Code Playgroud)

我想要的是一份差距清单

1-4
9-14
18-24
Run Code Online (Sandbox Code Playgroud)

我不知道perl,SQL或任何花哨的东西,但我想我可以做一些能从下一个中减去一个数字的东西.然后,我至少可以grep得到差异不是1-1的输出,并与之合作以获得差距.

Gil*_*not 66

:

awk '$1!=p+1{print p+1"-"$1-1}{p=$1}' file.txt
Run Code Online (Sandbox Code Playgroud)

说明

  • $1 是当前输入行的第一列
  • p 是最后一行的先前值
  • ($1!=p+1)条件$1也是如此:如果与前一个值+1不同,那么:
  • 这部分执行:: {print p+1 "-" $1-1}打印前一个值+1,-字符和第一列+ 1
  • {p=$1}对每一行执行:p分配给当前第1列

  • 请注意,如果源文件以标题行(对于`csv`文件常见)或"0"值开头,则这种漂亮的单行将无法正常工作.这可以解决我跳过文件的第一个`X`行,如下所示:`tail -n + X + 1'unique_items.csv'| awk'($ 1!= p + 1){print p + 1" - "$ 1 - 1} {p = $ 1}'`.例如,要跳过标题行和"0"值,可以使用:`tail -n + 3'unique_items.csv'| awk'($ 1!= p + 1){print p + 1" - "$ 1 - 1} {p = $ 1}'`. (3认同)

cho*_*oba 2

只需记住前一个数字并验证当前数字是否是前一个数字加一即可:

#! /bin/bash
previous=0
while read n ; do
    if (( n != previous + 1 )) ; then
        echo $(( previous + 1 ))-$(( n - 1 ))
    fi
    previous=$n
done
Run Code Online (Sandbox Code Playgroud)

您可能需要添加一些检查以防止出现诸如28-28单个数字间隙之类的行。