Bash固有の行ID

Bash固有の行ID

入力:ソートされた行を持つファイル

出力:入力ファイルに一意の行ID(最初またはランダム)を持つファイル

はい

入力する

abbylove
abbylove
abbylove
abbylover
abbylover
abbylovesyou
abbylovesyou
abbylsmith
abbylsmith
abbylyn
abbylynn

出力

1
4
6
8
10
11

0インデックスも大丈夫です。

そのような出力を生成する方法は?シェルuniqとコマンドsortでそのようなオプションが見つかりませんでした。

直す。

年だけの異なる埋め込みファイルで一意で隣接する行を検索しようとします。たとえば、ファイルをフィルタリングしたいとします。

abbylove2016
abbylove2017
abbylove2018
abb1999ylover
abb2005ylover
abbyloves2001you
abbyloves2006you
abbylsm1980ith
abbylsm2010ith
abbylyn2002
abbylynn1999

そしてちょうど得る

abbylove2016
abb1999ylover
abbyloves2001you
abbylsm1980ith
abbylyn2002
abbylynn1999

年をクリアすると役に立つと思います...

答え1

少なくともGNUの場合uniq

$ 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

まず、現在の行のすべての数字を削除し、結果を前の行と比較する方法で動作します(数字を削除した後)。一致するものがない場合は、元の現在の行を印刷します。

関連情報