콘텐츠에 따라 행 번호 지정

콘텐츠에 따라 행 번호 지정

내용에 따라 행의 번호를 매기고 싶습니다. 첫 번째 행은 1로 번호가 지정되고, 두 번째 행은 첫 번째 행과 같으면 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 }'

또한 첫 번째 단어(두 개 이상 있어야 하는 경우)뿐만 아니라 줄 전체가 중요하다고 생각합니다. 첫 번째 단어만 처리하려면 다음을 수행하십시오.

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))

관련 정보