아래와 같이 파이프로 구분된 텍스트 파일이 있습니다.
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=사용자; } } }'