Número de linhas de acordo com seu conteúdo

1

Eu gostaria de numerar as linhas de acordo com o conteúdo delas: a primeira linha obtém o número 1, a segunda linha, o número 2, se for idêntico ao primeiro, e o número 1, se for diferente, e assim por diante. Por exemplo:

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

Deve resultar em:

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
    
por martijn 05.09.2012 / 16:18

4 respostas

4

Ainda mais simples com o awk: -

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

Onde test é o arquivo que contém os dados. Eu fiz algumas suposições aqui que não estão claras na questão. Primeiro, presumo que o arquivo já esteja classificado. Se não, então: -

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

Além disso, suponho que a linha inteira seja significativa, e não apenas a primeira palavra, se houver mais de uma. Se você quer apenas trabalhar na primeira palavra, então: -

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

    
por 05.09.2012 / 17:04
1

Você pode fazer isso com awk :

number.awk

BEGIN { OFS = "\t" }

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

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

Funcione assim:

awk -f number.awk infile
    
por 05.09.2012 / 16:59
0

Você pode iterar pela entrada e usar um contador

#!/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

Você pode executar o script com:

$ sh scriptname.sh < inputfile
    
por 05.09.2012 / 16:32
0

Se você precisar de algo que funcione independentemente de a entrada estar em cluster (ou seja, todas as ocorrências de X sendo uma após a outra), você precisará usar algum contador para cada X diferente. use o seguinte como um filtro ou com um parâmetro ommandline, escrevendo para stdout:

#!/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))
    
por 17.05.2013 / 10:26