コンテンツに応じて行番号を指定する

コンテンツに応じて行番号を指定する

内容に応じて行の番号を付けたいです。最初の行は 1 に番号が付けられ、2 番目の行は最初の行と同じ場合は 2 に、異なる場合は 1 に指定されます。たとえば、

asdf
asdf
asdf
asdf
dfg
dfg
dfg
qwert
qwert
er
qwert
er
asdf

結果は次のとおりです。

1   asdf
2   asdf
3   asdf
4   asdf
1   dfg
2   dfg
3   dfg
1   qwert
2   qwert
1   er
3   qwert
2   er
5   asdf

答え1

awkを使うと簡単になります。

awk '{ print ++c[$0],$0 }' < test

ここでtestはデータを含むファイルです。ここではいくつかの仮定をしていますが、質問では明確ではありません。まず、ファイルがすでにソートされているとします。そうでない場合:-

sort < test | awk '{ print ++c[$0],$0 }'

また、最初の単語(2つ以上必要な場合)だけでなく、行全体が重要だと思います。最初の単語のみを処理するには、次のようにします。

awk '{ print ++c[$1],$0 }' < test

答え2

あなたはこれを行うことができますawk

数値.awk

BEGIN { OFS = "\t" }

last == $1 { cnt += 1}
last != $1 { cnt  = 1 }

{ print cnt, $1; last = $1 }

次のように実行します。

awk -f number.awk infile

答え3

入力を繰り返してカウンターを使用できます

#!/bin/sh                                                                                                                                                     

counter=1
old=""

while IFS= read -r line ; do
    # check if the line is different from the previous one
    if [ "$line" != "$old" ] ; then
        counter=1
    fi
    old="$line"
    printf '%s\t%s\n' "$counter" "$line"
    counter=$((counter+1))
done

次のコマンドを使用してスクリプトを実行できます。

$ sh scriptname.sh < inputfile

答え4

入力がクラスタ化されているかどうか(つまり、すべてのXが互いに後ろにある)とは独立して動作する必要がある場合は、他のXごとにいくつかのカウンタを使用する必要があります。たとえば、次をフィルタとして使用したり、コマンドライン引数と組み合わせて標準出力に書き込むことができます。

#!/usr/bin/env python
import sys, collections
c = collections.Counter()
for line in sys.stdin if len(sys.argv) == 1 else open(sys.argv[1]):
    c[line] += 1
    sys.stdout.write("%s\t%s" % (c[line], line))

関連情報