2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[AWK] グループごとに連番をつける

Last updated at Posted at 2019-01-30

めったにない需要でしょうが…:cold_sweat:

例えばこのようなテキストファイルがあり、

name.txt
Alice
Alice
Alice
Bob
Bob

名前ごとに連番をつけたいということがありました。

name_eachnumber.txt
Alice 1
Alice 2
Alice 3
Bob 1
Bob 2

当初はAWKでさくっとできると思っていましたが、力不足でうまくできず…
結局、下記のようにして目的の結果が得られました。

>name_eachnumber.txt     #空ファイルを作成します(必須ではない)

cat name.txt            | 
cut -f 1                | # 1列目をグループとします
sort -u                 | # AliceとBobの重複をなくします。
while read line; do     | # AliceとBobをひとつずつ回します。
grep ${line} name.txt   | # Aliceに引っかかる3行を、Bobに引っかかる2行を抽出します。
awk '{print $1,NR}' >> name_eachnumber.txt # AWKで行数を追加し、name_eachnumber.txtに挿入します。
done

もっと素直な書き方があると思います。
教えていただければありがたいです:pray:

=== 2019/01/31 追記 ===
@angel_p_57 さん、@jinoji さんに連想配列の使い方を教えていただきました!:bow:

cat name.txt | awk '{print $1, ++names[$1]}'

シンプルで素晴らしいです。感謝です。
++names[$1]をprintするとグループごとに番号を出力できるのですね。
もっと連想配列を勉強します…!

2
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?