bash 唯一行 ID

bash 唯一行 ID

输入:具有排序行的文件

输出:具有输入文件中的(第一个或任何)唯一行 ID 的文件

例子

输入

abbylove
abbylove
abbylove
abbylover
abbylover
abbylovesyou
abbylovesyou
abbylsmith
abbylsmith
abbylyn
abbylynn

输出

1
4
6
8
10
11

0 索引也可以。

如何创建这样的输出?我在 shelluniqsort命令中没有找到这样的选项。

更新。

我试图从它们包含的仅年份不同的文件中找到唯一的相邻行。例如,我想过滤文件

abbylove2016
abbylove2017
abbylove2018
abb1999ylover
abb2005ylover
abbyloves2001you
abbyloves2006you
abbylsm1980ith
abbylsm2010ith
abbylyn2002
abbylynn1999

并只得到

abbylove2016
abb1999ylover
abbyloves2001you
abbylsm1980ith
abbylyn2002
abbylynn1999

我认为消除岁月可能会有所帮助......

答案1

至少对于GNUuniq

$ nl input | uniq --skip-fields=1 | cut -f1
     1
     4
     6
     8
    10
    11

答案2

跟踪上一行是什么,并在当前行不等于前一行时输出所需的信息:

$ awk '$0 != prev { print NR, $0; prev = $0 }' file
1 abbylove
4 abbylover
6 abbylovesyou
8 abbylsmith
10 abbylyn
11 abbylynn

或者

$ awk '$0 != prev { print NR; prev = $0 }' file
1
4
6
8
10
11

对于更新的问题:

$ awk '{ curr=$0; gsub("[0-9]","",curr) } curr != prev { print; prev = curr }' file
abbylove2016
abb1999ylover
abbyloves2001you
abbylsm1980ith
abbylyn2002
abbylynn1999

其工作原理是首先删除当前行中的所有数字,然后将结果与上一行(删除数字后)进行比较。如果不匹配,则打印原始当前行。

相关内容