重複した番号でシリアル番号を生成する方法

重複した番号でシリアル番号を生成する方法

以下のようにパイプで区切られたテキストファイルがあります。

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)に「繰り返し」を追加するか、3番目のフィールドの前に実際のカウンタを追加します。書式設定および/または順序付けは読者の役割です。

答え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 =ユーザー; }}}

関連情報