次のような内容を含むファイルがあります:
red dog
red cat
red bird
red horse
blue hamster
blue monkey
blue lion
pink pony
pink whale
pink pig
pink dolphin
それぞれの色、そしてそれぞれの動物ごとにカウンターを増分する必要があります。赤は 1、青は 2、ピンクは 3 になります。次に、犬、猫、鳥、馬は 1、2、3、4 になります。新しい色を開始するので、ハムスターは再び 1 から開始する必要があります。
上記のファイルに対して「while read color animal」を実行すると、色が以前の色と等しくなくなった場合、比較するにはどうすればよいでしょうか?
私は次のようなものを探しています:
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
ご提案があれば、ぜひお聞かせください:)
答え1
次のような感じawk
:
$ awk '$1 != c { cc++; c=$1; ac=0; a="" } $2 != a { ac++; a=$2 } { printf("%d.%d\n", cc, ac) }' file
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
スクリプトawk
は次の 4 つのことを追跡します。
- 最後に読んだ動物の名前
a
。 - 最後に読んだ色
c
。 - 「動物カウンター」
ac
。 - 「カラーカウンター」
cc
。
入力の 2 つの列で見つかった内容に応じてこれらの変数を更新します。
- 色が最後に読んだ色と異なる場合は、色を増やし
cc
て記憶するこれ代わりに色を使用します。また、リセットして を使用しac
ますa
。 - 動物が最後に読んだものと異なる場合は、増加し
ac
て記憶するこれ代わりに動物。
次に、入力の各行に対してcc
と を出力します。ac
各行の動物が一意であることが保証されている場合は、a
変数を削除することができます。
答え2
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'
ハッシュは任意の時点でのキーの数を保持%h
しkeyA => count
てscalar keys %h
返します。次に、結果を逆にしてコンマで結合します。
結果
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4