중복된 번호로 일련번호를 생성하는 방법

중복된 번호로 일련번호를 생성하는 방법

아래와 같이 파이프로 구분된 텍스트 파일이 있습니다.

user     |amount|dept|flag
AAAAAAAAA|100.00|SALES|OK
BBBBBBBBB|250.00|ACCOUNT|OK
CCCCCCCCC|200.00|MARKETING|OK
DDDDDDDDD|175.00|ADMIN|OK
AAAAAAAAA|150.00|SALES|OK
BBBBBBBBB|200.00|ACCOUNT|OK

첫 번째 열을 기준으로 일련번호를 정렬하고 싶습니다. ~처럼

user     |amount|repeatation|dept|flag
AAAAAAAAA|100.00|1          |SALES|OK
AAAAAAAAA|100.00|2          |SALES|OK
BBBBBBBBB|250.00|1          |ACCOUNT|OK
BBBBBBBBB|250.00|2          |ACCOUNT|OK
CCCCCCCCC|200.00|1          |MARKETING|OK
DDDDDDDDD|175.00|1          |ADMIN|OK

자동 증가되는 많은 파일에 대해 일련 번호를 생성했지만 ++sl이에 대해 전혀 모릅니다.

답변1

노력하다

awk -F\| '{$3 = NR==1?"repetation":++T[$1] FS $3; }1' OFS=\| file
user     |amount|repetation|flag
AAAAAAAAA|100.00|1|SALES|OK
BBBBBBBBB|250.00|1|ACCOUNT|OK
CCCCCCCCC|200.00|1|MARKETING|OK
DDDDDDDDD|175.00|1|ADMIN|OK
AAAAAAAAA|150.00|2|SALES|OK
BBBBBBBBB|200.00|2|ACCOUNT|OK

"조건부 연산자"를 사용하여 헤더(NR==1)에 "반복"을 추가하거나 세 번째 필드 앞에 실제 카운터를 추가합니다. 형식화 및/또는 순서 지정은 독자의 몫입니다.

답변2

$ awk '
    BEGIN{FS=OFS="|"} {$2=sprintf("%s|%-10s", $2, (NR>1 ? ++rep[$1] : "repetition")); print (NR>1), $0}
' file | sort -t'|' -k1,1n -k2,2 -k4,4n | cut -d'|' -f2-
user     |amount|repetition|dept|flag
AAAAAAAAA|100.00|1         |SALES|OK
AAAAAAAAA|150.00|2         |SALES|OK
BBBBBBBBB|250.00|1         |ACCOUNT|OK
BBBBBBBBB|200.00|2         |ACCOUNT|OK
CCCCCCCCC|200.00|1         |MARKETING|OK
DDDDDDDDD|175.00|1         |ADMIN|OK

위의 내용은 선 종류를 분류하는 일반적인 관용구를 사용하여 먼저 범주별로 정렬한 다음 각 범주 내의 값별로 정렬할 수 있도록 합니다. 이 예에서는 NR>1헤더 행을 type 으로 분류 0하고 다른 모든 행을 type(이 방법의 가장 일반적인 적용)으로 분류 했으므로 1첫 번째 필드 출력을 정렬하면 헤더 행이 먼저 인쇄됩니다. 마지막으로 cut카테고리를 다시 삭제하세요.

답변3

Sort -k1 yourfile.txt |awk -F"|" '시작 { slno=0 } { user=$1; { if (user!=x) slno=1 { printf("|%9s|%10.2f|% 3s|%10s|%3s|\n",$1,$2,slno,$3,$4); slno++; x=사용자; } } }'

관련 정보